promise错误处理:使用reject而不是throw

promise.then(a, b)和promise.then(a).catch(b)这样写有区别吗,区别是什么?

1.使用promise.then(onFulfilled, onRejected)

在onFulfilled中发生异常的话,在onRejected中是捕获不到这个异常的。

2.在promise.then(onFulfilled).catch(onRejected)的情况下

then中产生的异常能在.catch中捕获


catch后面的then能执行,拿到的数据是catch return的还是catch之前的then return的?

Promise超时错误如何处理?

Promise如何接收响应和处理错误,手写


值穿透问题

new Promise(resolve=>resolve(8))??

.then()??

.catch()??

.then(function(value){? ? alert(value)? })

跟下面这段代码的行为是一样的

new Promise(resolve=>resolve(8))??

.then(function(value){return value? })??

.catch(function(reason){throw reason? })??

.then(function(value){? ? alert(value)? })


返回一个resolve

$ node test.js

111

222

then1:aaa

then2:undefined

then3:bbb

333:ccc

返回一个reject

$ node test.js

111

222

then1:aaa

then2:undefined

then3:bbb

eeee1:ccc

eeee2

注意在函数foo里面"then3"的位置,需要返回Promise.reject(),然后这个reject被"eeee1"处的catch捕获,然后这里必须再返回一个Promise.reject()到函数外面;如不然,相当于foo函数内部消化掉了"then3"位置的exception,导致在函数外部"eeee2"位置并不能捕获异常,因为此处会认为就没有异常发生。


Promise中的处理习惯上都会采用try-catch的风格,当发生异常的时候,会被catch捕获并被由在此函数注册的回调函数进行错误处理。

另一种异常处理策略是通过返回一个Rejected状态的promise对象来实现的,这种方法不通过使用throw就能在promise chain中对onRejected进行调用。

使用reject而不是throw

Promise的构造函数,以及被then调用执行的函数基本上都可以认为是在try...catch代码块中执行的,所以在这些代码中即使使用throw,程序本身也不会因为异常而终止。

如果在Promise中使用throw语句的话,会被try...catch住,最终promise对象也变为Rejected状态。

var promise=new Promise(function(resolve,reject){throw newError("message");});

promise.catch(function(error){console.error(error);// => "message"});

代码像这样其实运行时倒也不会有什么问题,但是如果想把promise对象状态设置为Rejected状态的话,使用reject方法则更显得合理。

所以上面的代码可以改写为下面这样。

var promise=new Promise((resolve,reject)=>{reject(new Error("message"));});

promise.catch((error)=>{console.error(error);// => "message"})

其实我们也可以这么来考虑,在出错的时候我们并没有调用throw方法,而是使用了reject,那么给reject方法传递一个Error类型的对象也就很好理解了。

4.3.1. 使用reject有什么优点?

话说回来,为什么在想将promise对象的状态设置为Rejected的时候应该使用reject而不是throw呢?

首先是因为我们很难区分throw是我们主动抛出来的,还是因为真正的其它异常导致的。


Promise中错误是如何处理的

var promise=Promise.resolve();

promise.then(function(){

? ??return Promise.reject(new Error("this promise is rejected"));})

.catch(onRejected);