一、

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

05-11 13:50