为什么Promise.race()
会发生这种行为,Promise.resolve(1(的计算速度比2更快?
Promise.race([Promise.resolve(1), 2]).then(console.log)
来自MDN文档
如果可迭代项包含一个或多个非promise值和/或一个已结算的promise,则promise.rece将结算到数组中找到的第一个值
const foreverPendingPromise = Promise.race([]);
const alreadyFulfilledProm = Promise.resolve(100);
const arr = [foreverPendingPromise, alreadyFulfilledProm, "non-Promise value"];
const arr2 = [foreverPendingPromise, "non-Promise value", Promise.resolve(100)];
const p = Promise.race(arr);
const p2 = Promise.race(arr2);
console.log(p);
console.log(p2);
setTimeout(() => {
console.log("the stack is now empty");
console.log(p);
console.log(p2);
});
// logs, in order:
// Promise { <state>: "pending" }
// Promise { <state>: "pending" }
// the stack is now empty
// Promise { <state>: "fulfilled", <value>: 100 }
// Promise { <state>: "fulfilled", <value>: "non-Promise value" }
基本上,Promise.race
和Promise.all
在参数上隐式调用Promise.resolve
,1刚好在2之前。
对于从then
回调、await
和其他几个地方返回的值也是如此,其目的是使promise和非promise代码之间的交互更容易。