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);