最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS Promise

    正文概述 掘金(~康)   2021-03-24   478

    这篇文章记录一下自己学习promise的心得,如果有不对的地方,欢迎各位指出!!

    基础用法

    学过promise,应该都了解到,这是js实现异步的一种方式,主要用于解决回调地狱的问题的,那么什么是回调地狱呢?

    当我们在进行接口请求时,如果有碰到这么一种情况,请求完接口a,利用接口a的结果去请求接口b接口,再用接口b的结果去请求接口c ......

    $.ajax({
        url: '/a',
        success: function(resA) {
            $.ajax({
                url: '/b',
                data: {a: resA},
                success: function(resB){
                    // ......
                }
            })    }
    })
    

    这个时候的回调函数是一层嵌套一层的,这就回调地狱的其中一种情况。这个时候的代码的可读性变得很差,所以我们可以用promise进行优化。

    const a = function() {
        new Promise((res, rej) => {
            $.ajax({
                url: '/a',
                success(data) {
                    res(data)        
                }
            })
        })
    }
    
    const b = function(dataA){
        return new Promise((res, rej) => {
            $.ajax({
                url: '/b',
                data: {a: dataA},
                success(data) {
                    res(data)        
                }
            })    })
    }
    
    a().then(data => {
        return b(data)
    }).then(data => {
        // ......
    })
    

    当我们把代码改为promise的写法时,看起来就方便很多了。

    promise.all

    记得早些时间面试的时候,有个面试官问我:“如何用promise实现图片按顺序加载?”,当时的我对于promise.all 这个方法并不是很熟悉,所以没有答上来。

    all 方法的意思是,等待所有的promise程序都返回结果之后执行后续的程序,代码表现为:

    let p1 = new Promise((resolve, reject) => {  resolve('成功了')})let p2 = new Promise((resolve, reject) => {  resolve('success')})let p3 = Promse.reject('失败')Promise.all([p1, p2]).then((result) => {  console.log(result)                //['成功了', 'success']}).catch((error) => {  console.log(error)})Promise.all([p1,p3,p2]).then((result) => {  console.log(result)}).catch((error) => {  console.log(error)      // 失败了,打出 '失败'})
    

    上面的程序中一共有三个promise为p1、p2、p3,其中p1、p2是执行成功的,p3是失败的。

    当我们用 all 方法监听 p1、p2时,因为监听的所有的promise都是成功的,所以程序进入then函数中,接收的参数result为一个数组,数组的每一项,是对应的监听顺序的每一项返回的参数。

    这时候回到‘面试官’的问题,假设我们有10张图片,虽然每张图片加载的时间不同,但是我们可以在所有的图片加载完成之后,再按照顺序渲染到页面中,以实现按顺序加载图片。

    而当我们用 all 方法监听 p1、p2、p3时,由于p3的执行失败了,所以程序就进入了catch中了,这个error接收的是失败的程序返回的值。

    promise.race

    let p1 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('success')  },1000)})let p2 = new Promise((resolve, reject) => {  setTimeout(() => {    reject('failed')  }, 500)})Promise.race([p1, p2]).then((result) => {  console.log(result)}).catch((error) => {  console.log(error)  // 打出的是 'failed'})
    

    race方法说的是,当程序中的任意一项执行完成后,执行后续的then或者catch。

    示例中p2的程序是0.5s执行完成的,所以程序进入的catch函数。

    当两个程序都是成功的时候,哪个promise先执行完成,then就接收到谁的参数执行后面的内容了,后面的promise执行完成就不会再触发then函数了

    感谢各位观看!!!


    起源地下载网 » JS Promise

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元