为什么嵌套的被拒绝的 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');
你:
- 对
Promise
对象调用reject()
函数。 - 丢弃结果。
即使此处创建了(拒绝) 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/