通常,当 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 ,这些 promise 在后台继续运行,没有任何错误处理,也没有任何关于未处理的 promise 拒绝的报告。这似乎有点危险。
举个例子。我试图为异步迭代实现 combine
逻辑(类似于 this ),这需要使用 Promise.race
,同时跟踪拒绝传递给任何参数它,因为 combine
函数需要在下一个请求时拒绝。
最佳答案
Normally, when a Promise in JavaScript rejects without handling, we get
unhandled promise rejection
error.
是的,当一个 promise 被拒绝时会发生这种情况,而该 promise 从未被 .then()
调用以安装处理程序,即一个链的最终 promise。
(注意 .catch(onRejected)
在内部委托(delegate)给 .then(undefined, onRejected)
,因此 promise 被标记为处理相同。)
But then what happens to all rejected promises ignored by
Promise.race
logic? Why don't they throw the same error?
Promise.race
确实在其参数中的所有 promise 上调用了 .then()
,将它们标记为已处理:
Promise.race = function(thenables) {
return new Promise((resolve, reject) => {
for (const thenable of thenables) {
Promise.resolve(thenable).then(resolve, reject);
}
});
};
请注意,当外部 promise 已经解决时,它不会重新抛出错误,它只是被忽略了。这是设计使然:当使用 Promise.race
时,您声明您只对第一个结果感兴趣,其他所有内容都可以丢弃。从未赢得竞赛的 promise 中导致未处理的 promise 拒绝使您的应用程序崩溃将是相当具有破坏性的。
关于javascript - Promise.race 中被拒绝的 promise 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70403153/