这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战
hi 我是小十七_,之前总结过一些 Promise 的基础知识,这是第三篇 Promise 总结(三)Promise 解决的问题,建议先看第一篇,第二篇,分享给大家~
Promise
是可信任的 Promise 吗
第三方库中有一个对象拥有 then 属性(function),会把他误认为Promise,为了兼容它不是真正 Promise 的情况,使用 Promise.resolve,会返回一个 Promise 的实例,如果参数为 Promise 的实例,会直接返回,否则会用返回的值填充:
Promise.resolve(foo(42)).then(function(res){
console.log(res);
}, function(err){
console.log(err);
})
链式 Promise
- 调用 Promise 的 then(..) 会自动创建一个新的 Promise 从调用返回。
- 在完成或拒绝处理函数内部,如果返回一个值或抛出一个异常,新返回的(可链接的)Promise 就相应地决议。
- 如果完成或拒绝处理函数返回一个 Promise,它将会被展开,这样一来,不管它的决议值是什么,都会成为当前 then(..) 返回的链接 Promise 的决议值。
错误处理
Promise 实例上调用 then 方法,then 中的 resolve 和 reject 参数函数中如果出现错误,需要下一个 .then 中去捕获,这样像是一个无尽的过程。
Promise.resolve(foo(42)).then(function(res){
console.log(a); // ??? .then 返回的是 Promise,需要再 .then 去捕获
}, function(err){
console.log(err);
})
Promise 原型有 .catch 方法,有人说 Promise 链的最后加上这个方法,可是 .catch 中写的错误谁来捕获呢?(也是返回了一个 Promise) 这个问题现在官方还没有完美的解决方法,在这个 asynquesce Promise 抽象库 中作者有自己的解决办法(.defer)
API
Promise.all([])
Promise.all 参数,两个 Promise 或其他 两个 Promise 都完成后进入 .then,参数为数组,两个 Promise resolve 的值 一个 reject 就不会进入 .then
Promise.race([])
两个 Promise 一个完成之后进入 .then,另一个被垃圾回收 第三方 Promise 和定时器 Promise 传进来,解决没有调用回调函数的问题
.catch(function(){})
捕获 Promise 链中所有未被处理的错误
顺序错误处理
var p = foo( 42 )
.then( STEP2 )
.then( STEP3 );
虽然这里可能令人迷惑,但是这里的 p 并不指向链中的第一个 promise(调用 foo(42) 产生的那一个),而是指向最后一个 promise,即来自调用 then(STEP3) 的那一个。