javascript 为什么`.catch`后面的`.then`回调会被执行?

fiei3ece  于 2023-03-28  发布在  Java
关注(0)|答案(3)|浏览(264)

**问题:**最后2个.then被调用,即使我返回Promise.reject()。第一个.then()打印undefined,第二个.then()也打印输出。

有人能解释一下为什么吗?

let p4 = new Promise((resolve,reject)=>{
    resolve("p4 Resolved");
});

p4.then((val)=>{
    console.log(val);
    return Promise.reject("20 Rejected")
}).catch((error)=>{console.log(error)})
  .then((val)=>{console.log(val);return 290})
  .then((val)=>{console.log("Last then : "+val);});
kmbjn2e3

kmbjn2e31#

catch也返回一个promise,因为你没有返回任何东西,它将是一个满足undefined的promise,因此第一个then打印undefined。最后,最后一个then从第一个then返回的promise中获取值290并打印它。

mum43rcc

mum43rcc2#

.catch()返回一个新的挂起的Promise
返回一个新的Promise。这个新的Promise在返回时总是挂起的,不管当前Promise的状态如何。如果onRejected抛出错误或返回一个本身被拒绝的Promise,它最终会被拒绝;- Promise#catch(),* 返回值 *|MDN
第一个.then()返回一个rejected promise,正如您所期望的,它调用.catch()。然而,由于作为参数(error => { console.log(error) })传递给它的回调不会抛出任何错误,因此新的promise将被实现,因此它将调用所有后续的.then()

2guxujil

2guxujil3#

当你在一个Promise链中嵌套多个.then()函数时,每个.then()函数将按照它们被链接的顺序依次执行。
每个.then()函数的结果作为参数传递给链中的下一个.then()函数。这允许您执行一系列异步操作并逐步处理结果。
链接参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#chaining

相关问题