我创造了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中解释这种情况?
注意:请在控制台中运行此代码然后回答。 它在我当地没有任何回报。
答案 0 :(得分:2)
正如您在自己的示例中所写的那样,您承诺p1
,p2
和p3
同时解决*。
如果iterable包含一个或多个非promise值和/或a 已经解决/拒绝的承诺,然后Promise.race将解决 在iterable中找到的第一个值。
虽然这些承诺在给予race
时尚未解决,但由于它们都在同一时间结算,race
将使用列表中第一个的结果。在这种情况下,即p1
。
所以:
p4.then(console.log) // Prints 42
并且您可以通过注意如果您更改了p1
数组中p2
,p3
和race
的顺序来验证这一点,那么您就是&#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));