为什么 Promise.all() 即使我 .catch() 也会抛出异常?
Why does Promise.all() throw an exception even if I .catch() it?
运行代码
Promise.all(new Promise((res, rej) => rej('Failure!')))
.catch(() => console.log("It's all okay."))
在 Node v12.19.0 中将 It's all okay.
记录到控制台,但仍然抛出异常。这是为什么?我会期待与 运行
时相同的行为
new Promise((res, rej) => rej('Failure!'))
.catch(() => console.log("It's all okay."))
这也会将 It's all okay.
记录到控制台,但不会引发异常。
如何在 Promise.all() 中捕捉到拒绝?
完整的控制台输出:
> Promise.all(new Promise((res, rej) => rej('Failure!'))).catch(() => console.log("It's all okay."))
Promise { <pending> }
> It's all okay.
(node:2872) UnhandledPromiseRejectionWarning: Failure!
(node:2872) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 4)
> new Promise((res, rej) => rej('Failure!')).catch(() => console.log("It's all okay."))
Promise { <pending> }
> It's all okay.
正如评论中 Bergi 所指出的...
如果你在没有 catch 语句的情况下执行你的第一段代码(或者实际打印你捕获的错误)你会看到发生了什么。
Promise.all(new Promise((res, rej) => rej('Failure!')))
Returns:
Promise {<rejected>: TypeError}
Uncaught (in promise) Failure!
Uncaught (in promise) TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))
at Function.all (<anonymous>)
at <anonymous>:1:9
注意第一个错误是我们通过拒绝承诺抛出的错误。
第二个错误是因为没有正确使用 Promise.all()
,这就是您捕获的错误。
由于 Promise.all()
方法的不正确使用,我们通过拒绝 promise 抛出的错误从未被捕获。
现在,让我们用数组中的 promise 来测试代码,这是 Promise.all()
的正确用法,正如 Barmar 在评论中指出的那样。
Promise.all([new Promise((res, rej) => rej('Failure!'))])
.catch(() => console.log("It's all okay."))
Returns:
Promise {<fulfilled>}
It´s all okay.
所以,我们成功捕获了被拒绝的承诺错误。
另外值得注意的是,最终返回的promise是catch()
方法returns执行后的promise。由于我们成功执行了 catch 语句,因此实现了这一点,尽管 Promise.all()
实际上 returns 的承诺被拒绝了。
运行代码
Promise.all(new Promise((res, rej) => rej('Failure!')))
.catch(() => console.log("It's all okay."))
在 Node v12.19.0 中将 It's all okay.
记录到控制台,但仍然抛出异常。这是为什么?我会期待与 运行
new Promise((res, rej) => rej('Failure!'))
.catch(() => console.log("It's all okay."))
这也会将 It's all okay.
记录到控制台,但不会引发异常。
如何在 Promise.all() 中捕捉到拒绝?
完整的控制台输出:
> Promise.all(new Promise((res, rej) => rej('Failure!'))).catch(() => console.log("It's all okay."))
Promise { <pending> }
> It's all okay.
(node:2872) UnhandledPromiseRejectionWarning: Failure!
(node:2872) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 4)
> new Promise((res, rej) => rej('Failure!')).catch(() => console.log("It's all okay."))
Promise { <pending> }
> It's all okay.
正如评论中 Bergi 所指出的...
如果你在没有 catch 语句的情况下执行你的第一段代码(或者实际打印你捕获的错误)你会看到发生了什么。
Promise.all(new Promise((res, rej) => rej('Failure!')))
Returns:
Promise {<rejected>: TypeError}
Uncaught (in promise) Failure!
Uncaught (in promise) TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))
at Function.all (<anonymous>)
at <anonymous>:1:9
注意第一个错误是我们通过拒绝承诺抛出的错误。
第二个错误是因为没有正确使用 Promise.all()
,这就是您捕获的错误。
由于 Promise.all()
方法的不正确使用,我们通过拒绝 promise 抛出的错误从未被捕获。
现在,让我们用数组中的 promise 来测试代码,这是 Promise.all()
的正确用法,正如 Barmar 在评论中指出的那样。
Promise.all([new Promise((res, rej) => rej('Failure!'))])
.catch(() => console.log("It's all okay."))
Returns:
Promise {<fulfilled>}
It´s all okay.
所以,我们成功捕获了被拒绝的承诺错误。
另外值得注意的是,最终返回的promise是catch()
方法returns执行后的promise。由于我们成功执行了 catch 语句,因此实现了这一点,尽管 Promise.all()
实际上 returns 的承诺被拒绝了。