javascript - Promise.race 中被拒绝的 promise 会发生什么?

标签 javascript node.js promise

通常,当 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/

相关文章:

javascript - 更改事件上的 jquery datetimepicker 格式

node.js - 排除在 AWS X-Ray 中跟踪的路径

javascript - 在 forEach 循环中使用 async/await

javascript - promise API

JavaScript/jQuery - 未捕获类型错误 - 但变量已在脚本中启动

javascript - 穿过充满物体的物体

javascript - Twitter codebird.js 无需 pincode 授权

javascript - eslint 禁用扩展覆盖

javascript - 在 NodeJS 中获取数组值时出现问题

javascript - 如何从 Javascript 中已解决的 promise 列表中获取最后一个已解决的 promise ?