为什么promise.race在其中一个参数拒绝时返回none?

时间:2018-05-03 23:50:16

标签: javascript node.js promise es6-promise

我创造了3个承诺,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运行得更快。当我在节点中运行时,它返回none。 如何在Promise.race中解释这种情况?

注意:请在控制台中运行此代码然后回答。 它在我当地没有任何回报。

1 个答案:

答案 0 :(得分:2)

正如您在自己的示例中所写的那样,您承诺p1p2p3同时解决*。

来自docs of Promise.race

  

如果iterable包含一个或多个非promise值和/或a   已经解决/拒绝的承诺,然后Promise.race将解决   在iterable中找到的第一个值。

虽然这些承诺在给予race时尚未解决,但由于它们都在同一时间结算,race将使用列表中第一个的结果。在这种情况下,即p1

所以:

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

并且您可以通过注意如果您更改了p1数组中p2p3race的顺序来验证这一点,那么您就是&#39 ; ll总能看到第一个结果。



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));