码迷,mamicode.com
首页 > 其他好文 > 详细

Promise注意点

时间:2019-01-03 10:51:26      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:递归   不可   wrap   前端   data   cti   return   ons   catch   

一、

Promise API  概述

var p = new Promise( function(resolve,reject){
// resolve(..) 用于决议 / 完成这个 promise
// reject(..) 用于拒绝这个 promise
} );

 reject(..)  就是拒绝这个 promise ;但 resolve(..)  既可能完成 promise ,也可能拒绝
根据传入参数而定。如果传给 resolve(..)  的是一个非 Promise 、非 thenable  的立即值,这个 promise  就会用这个值完成。但是,如果传给 resolve(..)  的是一个真正的 Promise  或 thenable  值,这个值就会被递归展开,并且(要构造的) promise  将取用其最终决议值或状态

 

二、

var p = Promise.resolve(42);
p.then(
    function fulfilled(msg) {
        //  数字没有 string 函数,所以会抛出错误
        console.log(msg.toLowerCase());
    },
    function rejected(err) {
        //  永远不会到达这里
    }
);

 msg.toLowerCase()  合法地抛出一个错误,为什么我们的错误处理函数没有得到通知呢?正如前面解释过的,这是因为那个错误处理函数是为 promise p  准备的,而这个 promise  已经用值 42  填充了。 promise p  是不可变的,所以唯一可以被通知这个错误的 promise  是从 p.then(..)  返回的那一个,但我们在此例中没有捕捉。

为了避免丢失被忽略和抛弃的 Promise  错误,一些开发者表示, Promise  链的一个最佳实践就是最后总以一个catch(..)  结束,比如:

 

var p = Promise.resolve(42);
p.then(
    function fulfilled(msg) {
        //  数字没有 string 函数,所以会抛出错误
        console.log(msg.toLowerCase());
    },
    function rejected(err) {
        //  永远不会到达这里
    }
).catch(function(err){
    console.log(err);
})

 四、对方法进行Promise包装

if(!Promise.wrap){
    Promise.wrap = function(fn){
       return function(){
        var args = [].slice.call(arguments);
        return new Promise(function(resolve,reject){
            fn.apply(null,args.concat(function(err,v){
                if(err){
                    reject(err);
                }else{
                    resolve(v);
                }
            }))
        })

       } 
    }
}



function myajax(url,cb){
    $.ajax({
        url: url,
        type: ‘GET‘,
    })
    .done(function(data) {
        cb(null,data)
    })
    .fail(function(err) {
        cb(err)
    })
    
}

var request = Promise.wrap(myajax);
request(‘api/xxx‘)

 欢迎加入大前端交流群!群号:277942610

Promise注意点

标签:递归   不可   wrap   前端   data   cti   return   ons   catch   

原文地址:https://www.cnblogs.com/liumingwang/p/10207971.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!