【发布时间】:2022-01-20 23:14:48
【问题描述】:
通常,当 JavaScript 中的 Promise 未经处理而拒绝时,我们会收到 unhandled promise rejection 错误。
但是,Promise.race 逻辑忽略的所有被拒绝的 Promise 会发生什么?为什么他们不抛出同样的错误?
考虑以下测试:
const normal = new Promise((resolve, reject) => {
setTimeout(() => resolve(123), 100);
});
const err = new Promise((resolve, reject) => {
setTimeout(() => reject('ops'), 500);
});
const test = Promise.race([normal, err]);
test.then(data => {
console.log(data);
});
上面的测试只输出123,但我们的err promise 没有unhandled promise rejection 错误。
我试图了解所有那些被拒绝的承诺会发生什么,因此提出了这个问题。
我们最终可能会得到一堆松散的 Promise,它们会继续在后台运行,没有任何错误处理,也不会报告任何关于未处理的 Promise 拒绝的报告。这似乎有点危险。
举个例子。我试图为异步迭代实现combine 逻辑(类似于this),这需要使用Promise.race,同时跟踪传递给它的任何参数的拒绝,因为combine 函数需要然后拒绝下一个请求。
【问题讨论】:
-
当你使用
Promise.race时,你告诉系统你只关心第一个被拒绝或解决的承诺,第二个被忽略。有关详细信息,请参阅文档。 -
"我试图了解所有那些被拒绝的承诺会发生什么,因此问题。" 没有任何反应。使用
race,您只关心第一个完成的承诺,而不关心其余的。所以,被拒绝也没关系。实现它并不重要。 -
@fredrik 被
Promise.race忽略的承诺继续执行,并可能导致拒绝。我没有看到文档说像other rejected promises are just swallowed这样的东西。您实际上最终会得到一堆松散的 Promise,这些 Promise 会继续在后台运行,并且没有任何错误处理。这似乎不对。 -
@vitaly-t 承诺没有“运行”。可以解决 Promise 的任务仍在运行,是的,但您无能为力,因为没有取消机制。
-
@Kaiido
catch从未在内部调用。总是.then()有两个参数。
标签: javascript node.js promise