javascript - promise 链接 : Adding an error handler when creating a Promise vs adding to a variable with a promise

标签 javascript node.js promise

function getPromise() {
    return new Promise((resolve, reject) => {
        setTimeout(reject, 2000, new Error('fail'));
    });
}

const promise1 = getPromise();
promise1.catch(() => {
    // NOP
});

promise1
    .then(() => console.log('then promise1'))
    .catch(() => console.error('catch promise1'));

const promise2 = getPromise().catch(() => {
    // NOP
});

promise2
    .then(() => console.log('then promise2'))
    .catch(() => console.error('catch promise2'));

输出

catch promise1
then promise2

说明

此处 promise2 的处理方式与 promise1 不同。 promise1 将因“失败”错误而被拒绝,而 promise2 将以 undefined 解决。

我的环境

Ubuntu 14.04,Node.js 10.1.0

问题

我认为这种行为并不明显。为什么代码会这样工作?

最佳答案

因为您不是将第二个链接到拒绝 promise ,而是链接到 catch 返回的 promise ,它将解析为您从 catch 处理程序返回的任何内容。

 Promise(promise1)
  -❎-> catch
  -✔-> then -❎- > catch
  -❎-----------------^

Promise
  -❎-> catch(promise2)
           -✔-> then -❎-> catch
           -❎-----------------^
  -✔------------^

在第一种情况下,promise 拒绝,所以它会进入直接分配给它的 catch,它会跳过 then,直接进入链式 捕捉。在第二种情况下,promise 被拒绝并且 catch 将被执行,但随后它似乎处理了错误,因此链式 then 将被调用。如果你不想这样,catch 必须重新throw 错误,然后 then 将被跳过,它也进入链式捕捉

关于javascript - promise 链接 : Adding an error handler when creating a Promise vs adding to a variable with a promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51349921/

相关文章:

javascript - bluebird Promise catch() 未使用 Promise.CancellationError 调用内部函数

javascript - Angular : block/wait until promise is done

javascript - Backbone - 将模型更改保存到本地对象

javascript - 如何创建函数模型?

node.js - 用户被覆盖,但仅有时在 Node.js/Mongoose/Passport/Connect-Mongo 应用程序中

javascript - 表达 js : How to download a file using POST request

javascript - 获取宽度或高度 svg 矩形 javascript

javascript - id值在dreamweaver中必须是唯一的?

Node.js 上的 MongoDB 'error: non ascii character detected'

javascript - 异步函数返回 Promise <Pending>