javascript - 当参数之一拒绝时,为什么 promise.race 不返回?

标签 javascript node.js promise es6-promise

我创建了 3 个 promise ,p1,p3 解决,而 p2 拒绝。

代码:

            let p1 = new Promise((resolve, reject) => {
                resolve(42);
            });
            let p2 = Promise.reject(43);

            let p3 = new Promise((resolve, reject) => {
                resolve(44);
            });
            let p4 = Promise.race([p1, p2, p3]);

            p4.catch((value) => {
                console.log(value); 
            });

根据代码,p4 应该返回 43,因为 p3 运行速度比 p1 和 p2 快。当我在 Node 中运行时,它不返回任何内容。 在 Promise.race 中如何解释这种情况?

注意:请在控制台中运行此代码然后回答它。 它不会在我的本地返回任何内容。

最佳答案

正如您在示例中编写的那样,您 promise p1p2p3 全部同时结算*。

来自docs of Promise.race :

If the iterable contains one or more non-promise value and/or an already resolved/rejected promise, then Promise.race will resolve to the first of these values found in the iterable.

虽然这些 promise 在提供给 race 时尚未结算,但由于它们同时结算,race 将使用第一个 promise 的结果列表。在本例中,它是 p1

所以:

p4.then(console.log) // Prints 42

并且您可以通过注意如果更改数组中 p1p2p3 的顺序来验证这一点比赛,您总是会看到第一个比赛的结果。

let p1 = new Promise((resolve, reject) => {
  resolve(42);
});

let p2 = Promise.reject(43);

let p3 = new Promise((resolve, reject) => {
  resolve(44);
});

let p4 = Promise.race([p1, p2, p3]);
let p5 = Promise.race([p2, p1, p3]);
let p6 = Promise.race([p3, p2, p1]);

p4.then(r => console.log("p4", r), r => console.log("p4", r));
p5.then(r => console.log("p5", r), r => console.log("p5", r));
p6.then(r => console.log("p6", r), r => console.log("p6", r));

关于javascript - 当参数之一拒绝时,为什么 promise.race 不返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50165251/

相关文章:

javascript - 在 Javascript 中使用 RegExp 分割字符串 ( {a},{b} )

javascript - 如何使用 node.js 修复 Twilio 中无效的内容类型 header ?

javascript - globalAlpha 只影响 Canvas 的一层?

java - 在 java RESTful Web 服务中接收 JSON 对象 (javax.ws..rs.*) Jersey

javascript - 将 reject() 跳过 Promise 中所有随后的 then()

javascript - node.js - 从大型 XML 文件中提取 XML 片段

javascript - 无法在node.js中构造异步操作

javascript - MongoDB 对同一集合进行多次查找

reactjs - 如何使用 Jest 正确测试被拒绝的 Promise?

Javascript - 如何使用循环正确处理 promise ?