gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:07:05 24 4
gpt4 key购买 nike

为什么嵌套的被拒绝的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com