为什么可以在最后只使用一个 catch()?

问题描述 投票:0回答:1

我知道

promise 3
被拒绝是因为它解决了一个 已经被拒绝的承诺 (
promise 2
),但是
promise 3
怎么会拒绝
promise 4
?, 幕后发生了什么?

Promise.resolve(6) // promise 1
 .then(function(data) {
    console.log('then 1:' + data);
    return Promise.reject(new Error('ups - rejected')); // Does it "jump" to the first catch() it finds?
 }) // promise 2 - this promise is resolved with a **rejected promise**
 .then(function (data) {
    console.log('then 2:' + data);
    return data + 1; 
 }) // promise 3
.then(function (data) {
    console.log('then 3:' + data);
    return data + 1; 
 }) // promise 4 
 .catch(function(error) { // catch of promise 4?
  console.log(error);
 });

输出:

then 1:6
index.js:57 Error: ups - rejected
    at index.js:46:27
javascript exception asynchronous error-handling promise
1个回答
2
投票

Promises 3 和 4 并没有被完全跳过。与

then()
的文档一样,
then
的第一个参数提供了当 Promise 被解决时要做什么,第二个参数提供了当 promise 被拒绝时要做什么。

onFulfilled
onRejected
处理程序都提到当参数不存在或不是函数时,参数被视为恒等函数:

onFulfilled:“如果它不是一个函数,它在内部被替换为一个身份函数(

(x) => x
),它只是向前传递实现值。”

onRejected:“如果它不是一个函数,它在内部被替换为一个抛出函数(

(x) => { throw x; }
),抛出它收到的拒绝原因。”

因为 promise 2 被拒绝,并且因为创建 promise 3 的

then
处理程序没有第二个参数,所以 promise 3 只采用与 promise 2 相同的解决方案。与 promise 4 相同,因为 promise 3 被拒绝并且
 then
只有第一个参数。

因为 promise 4 的分辨率与 promise 3 和 promise 2 相匹配,它近似于“跳到下一个捕获”(或跳到下一个两个参数

then
),但这只是因为你看不到 promise 3 和 promise 4 reject with与 promise 2 相同的结果。如果您将它们保存到一个变量中并稍后检查它们,您会看到它们被拒绝,并显示您在第一个
then
块中设置的消息。

© www.soinside.com 2019 - 2024. All rights reserved.