Promise 总结(三)Promise 和相关 API

186 阅读2分钟

这是我参与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) 的那一个。