最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 异步无处不在:Promise 破除“回调地狱”(三)

    正文概述 掘金(勾崽)   2021-01-13   374

    前两篇讨论了异步模式和回调函数,结尾谈到了令人头皮发麻的回调地狱。

    要想拯救出回调地狱的代码,只有请我们的 Promise 出山了。

    拯救头发小斗士,出发!

    Promise

    异步无处不在:Promise 破除“回调地狱”(三)

    Promise 译为承诺、许诺、希望,意思就是异步任务交给我来做,一定(承诺、许诺)给你个结果。

    在执行的过程中,Promise 的状态会修改为 pending。一旦有了结果,就会再次更改状态。

    异步执行成功的状态是 Fulfilled , 这就是承诺给你的结果。状态修改后,会调用成功的回调函数 onFulfilled 来将异步结果返回。

    异步执行成功的状态是 Rejected,这就是承诺给你的结果。然后调用 onRejected 说明失败的原因(异常接管)。

    如果将前面对 ajax 函数的封装,改为 Promise 的方式,结果又会是什么?

    Promise 重构 Ajax 的异步请求封装

    function myAjax(url) {
        return new Promise(function (resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function () {
                if (this.readyState == 4) {
                    if (this.status == 200) {
                        // 成功的回调
                        resolve(this.responseText)
                    } else {
                        // 失败的回调
                        reject(new Error());
                    }
                }
            }
    
            xhr.open('get', url)
            xhr.send();
        })
    }
    

    还是前面提到的逻辑,如果返回的结果中,又有 ajax 请求需要发送,可一定记得使用链式调用,不要在 then 中直接发起下一次请求,否则,又是地狱相见了。

    //  ==== Promise 误区====
    myAjax('./d1.json').then(data=>{
        console.log(data);
        myAjax('./d2.json').then(data=>{
            console.log(data)
            // ……回调地狱……
        })
    })
    

    链式的意思就是在上一次 then 中,返回下一次调用的 Promise 对象,我们的代码就不会进地狱了。

    myAjax('./d1.json')
        .then(data=>{
        console.log(data);
        return myAjax('./d2.json')
    })
        .then(data=>{
        console.log(data)
        return myAjax('./d3.json')
    })
        .then(data=>{
        console.log(data);
    })
        .catch(err=>{
        console.log(err);
    })
    

    终于逃脱了回调地狱!

    虽然我们脱离了回调地狱,但是 .then 的链式调用依然不太友好。

    频繁的 .then 并不符合自然的运行逻辑,Promise 的写法只是回调函数的改进,使用then 方法以后,异步任务的两段执行看得更清楚了,除此以外,并无新意。

    Promise 的最大问题是代码冗余。原来的任务被 Promise 包装了一下,不管什么操作,一眼看去都是一堆 then,原来的语义变得很不清楚。

    于是,在 Promise 的基础上,Async 函数出现了。

    终极异步解决方案,千呼万唤地在 ES2017 中发布了。

    下一篇,展开说说(ง •_•)ง。


    起源地下载网 » 异步无处不在:Promise 破除“回调地狱”(三)

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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