这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
promise中的错误处理:
1 ,普通函数使用try- catch来进行错误处理就只是同步的处理。
2,普通回调中尝试了用error-first 回调风格。严格说来,这一类错误处理是支持异步的,但完全无法很好地组合。多级 error-first 回调交织在一起,再加上这些无所不在的 if 检查语句,都不可避免地导致了回调地狱的风险。
3,promise中其中拒绝处理函数被传递给 then(..)。Promise 没有采用流行的 error-first 回调设计风格,而是使用了分离回调(split-callback)风格。一个回调用于完成情况,一个回调用于拒绝情况:运用两个方法fulfilled和rejected。这非常容易造成错误被吞掉。
var p = Promise.resolve( 42 );
p.then(
function fulfilled(msg){
// 数字没有string函数,所以会抛出错误
console.log( msg.toLowerCase() );
},
function rejected(err){
// 永远不会到达这里
}
);
4,为了避免错误被忽略或丢失,又采用了在最后用catch()方式
var p = Promise.resolve( 42 );
p.then(
function fulfilled(msg){
// 数字没有string函数,所以会抛出错误
console.log( msg.toLowerCase() );
}
)
.catch( handleErrors );
但是如果handleErrors也出现错误,谁来捕捉?而且catch的返回promise也没有进行捕捉和处理。
5,promise错误处理该如何发展?
Promise 模式:
1,promise.all()参数是一个数组,主promise只有在所有promise成功完成后才会返回结果,如果中间有一个失败就会立即被拒绝并丢弃所有结果。
2,promise.race()正如单词的意思~竞赛。一旦有一个promise完成就会立即结束,就像百米冲刺只取冠军一样。
3,一些变体:
-
none([ .. ]) 这个模式类似于 all([ .. ]),不过完成和拒绝的情况互换了。所有的 Promise 都要被 拒绝,即拒绝转化为完成值,反之亦然。
-
any([ .. ]) 这个模式与 all([ .. ]) 类似,但是会忽略拒绝,所以只需要完成一个而不是全部。
-
first([ .. ]) 这个模式类似于与 any([ .. ]) 的竞争,即只要第一个 Promise 完成,它就会忽略后续 的任何拒绝和完成。
-
last([ .. ]) 这个模式类似于 first([ .. ]),但却是只有最后一个完成胜出。
当心!若向 Promise.all([ .. ]) 传入空数组,它会立即完成,但 Promise. race([ .. ]) 会挂住,且永远不会决议。