javascript - 为什么父 promise 不会捕获嵌套 promise 的拒绝?

标签 javascript node.js promise es6-promise

为什么嵌套的被拒绝的 Promise 不会被父 Promise 捕获?但是,如果我在父 promise 中进行“ throw ”,它就会被捕获。

var parent = new Promise((res, rej) => {
    // this DOES NOT get caught by the parent. 
    Promise.reject("A plain reject");

    // this gets caught by the parent
    // throw new Error("Arbitrary  error");
});

parent.catch(err => {
    console.log("parent catches the error");
});

更新:我不想在父级捕获被拒绝的 promise 的地方重写此代码。我只是想了解“为什么”?谢谢!

最佳答案

您并没有拒绝父级,您只是创建了一个新的嵌套被拒绝的 Promise,然后立即将其丢弃。

您可以这样重写:

const parent = new Promise((res, rej) => {
    // nested reject
    Promise.reject("A plain reject").then(res, rej);
});

这仍然是一个糟糕的模式。如果可以的话,你真的应该尽量避免 new Promise 。在没有看到更实际的示例的情况下,很难真正告诉您如何正确编写它,因为上面的内容可以重写为:

const parent = Promise.reject("A plain reject");

编辑对您的后续行动的回复:

更新:我不想在父级捕获被拒绝的 promise 的地方重写此代码。我只是想了解“为什么”?谢谢!

当您抛出异常时,这是一种语言功能,它会停止当前函数并引发异常,直到调用堆栈中的某些内容catch为止。

当你写下这样的声明时:

Promise.reject('foo');

你:

  1. Promise 对象调用 reject() 函数。
  2. 丢弃结果。

即使此处创建了(拒绝) promise ,您也不会对其结果执行任何操作。这与调用函数完全相同,但不对返回的内容执行任何操作,并想知道结果去了哪里。

所以你最初的例子:

var parent = new Promise((res, rej) => {
    // this DOES NOT get caught by the parent. 
    Promise.reject("A plain reject");

    // this gets caught by the parent
    // throw new Error("Arbitrary  error");
});

实际上与以下内容相同:

var parent = new Promise((res, rej) => {
    // this DOES NOT get caught by the parent. 
    true;

});

var parent = new Promise((res, rej) => {
    // this DOES NOT get caught by the parent. 
    5;

});

var parent = new Promise((res, rej) => {
    // this DOES NOT get caught by the parent. 
    "hello".indexOf('h');

});

该行被执行,但它“毫无意义”,因为它没有副作用。

关于javascript - 为什么父 promise 不会捕获嵌套 promise 的拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55521223/

相关文章:

javascript - Angular : centralised resource factory with promises

javascript - 为什么这个正则表达式不接受我的模式? (适用于闪光灯)

javascript - jquery $.when - 有什么方法可以阻止 .fail 提前触发吗?

node.js - Bluebird promise - 每个功能

node.js - 为什么在聊天应用程序中使用 redis?

javascript - 无法重新启动 Node 服务器

node.js - 使用 jasmine.any,预期和实际 SEEM 匹配

javascript - SVG 中的字体图标在 IE 11 中不起作用

javascript - 将 javascript Date() 转换为 UTC 和偏移时间

javascript - 如何计算垂直时间轴的比例