Promise.race() 返回已解决的承诺而不是第一个被拒绝的承诺

问题描述 投票:0回答:1

当我运行以下代码时,它会输出“Promise 1”,即使在比赛中首先解决的 Promise 是 Promise2 并且应该输出“Error Promise 2”。 “Promise 1”输出背后的逻辑是什么?

根据 mdn 文档,“...如果第一个要解决的承诺得到履行,则它会实现;如果第一个要解决的承诺被拒绝,则它会拒绝。”

try{
    // Promise 1
    const promise1 = new Promise((resolve, reject) => {
        setTimeout(() => resolve('Promise 1'), 2000);
    });
    // Promise 2
    const promise2 = new Promise((resolve, reject) => {
        setTimeout(() => reject('Error Promise 2'), 2000);
    });

    // Promise 3
    const promise3 = new Promise((resolve, reject) => {
        setTimeout(() => reject('Error Promise 3'), 2000);
    });

    const result = await Promise.race( [promise2, promise1, promise3]);
    console.log(result);

} catch(err) {
    console.log(err.message);
}

它输出: 承诺1

根据 mdn 文档,关于

Promise.race
,它指出:

当您希望第一个异步任务完成,但不关心其最终状态(即它可以成功或失败)时,它很有用。

javascript node.js ecmascript-6 es6-promise
1个回答
0
投票

我想我明白困惑在哪里了。 MDN 文档中的“第一个”是指第一个按时间顺序,而不是您给出的数组中的承诺顺序

Promise.race

在您的代码中,第一个要解决的 Promise(时间方面)是 Promise 1,因为您连续安排了 3 个超时,所有超时都为 2000 毫秒,所以第一个安排的就是第一个得到的被调用,从而首先解决它的承诺(时间方面)。

您给出的数组中承诺的顺序

Promise.race
通常与它给您的结果无关。只有在您致电 Promise.race 之前承诺已经
已经解决的情况下才重要。在这种情况下,是的,它将是数组中的第一个。

© www.soinside.com 2019 - 2024. All rights reserved.