Promise注意点

一、

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

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