当我运行以下代码时,它输出‘Promise 1’,即使在竞争中第一个解决的Promise应该是Promise 2,并且应该输出‘Error Promise 2’.作为‘Promise 1’的输出背后的逻辑是什么?

根据mdn docs,".如果第一个解决promise 被履行,则它履行,如果第一个解决promise 被拒绝,则它拒绝."

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

它的输出: promise 1

根据MDN文件,大约有Promise.race份,它说:

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

推荐答案

我想我知道困惑在哪里了.MDN文档所说的"第一"指的是第一个in time order,而不是你给出Promise.race的数组中promise 的顺序.因此,promise2是数组的第一个元素并不重要,因为当您调用Promise.race时,这些promise 都还没有确定下来.

在您的代码中,要解决的第一个promise (按时间)是Promise 1,因为您正在调度连续三个超时,所有超时都是2000ms,因此第一个调度的超时是第一个被调用的超时,从而首先(按时间)解析它的promise .第一个被调度的是promise1的计时器,因为您提供的new Promise(promise executor function)函数在new Promise调用期间被调用synchronously.

(async () => {
    try {
        // Promise 1
        const promise1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log("resolving promise1");
                resolve("Promise 1");
            }, 2000);
        });
        // Promise 2
        const promise2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log("rejecting promise2");
                reject("Error Promise 2");
            }, 2000);
        });

        // Promise 3
        const promise3 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log("rejecting promise3");
                reject("Error Promise 3");
            }, 2000);
        });

        const result = await Promise.race([promise2, promise1, promise3]);
        console.log(result);
    } catch (err) {
        console.log(err.message);
    }
})();

您给出Promise.race的数组中promise 的顺序通常与它给出的结果无关.只有在你拨打Promise.race之前,promise 已经达成already的情况下,这才有关系.在这种情况下,是的,它将是数组中的第一个.

(async () => {
    try {
        const promise1 = Promise.resolve("Promise 1");
        const promise2 = Promise.reject("Error Promise 2");
        const promise3 = Promise.reject("Error Promise 3");

        // The promises have already settled before we call Promise.race
        const result = await Promise.race([promise2, promise1, promise3]);
        console.log(result);
    } catch (err) {
        console.log(err);
    }
})();

Javascript相关问答推荐

一次仅播放一个音频

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

react/redux中的formData在expressjs中返回未定义的req.params.id

在Angular中将样式应用于innerHTML

react—router v6:路由没有路径

为什么!逗号和空格不会作为输出返回,如果它在参数上?

显示图—如何在图例项上添加删除线效果?

在Three JS中看不到补间不透明度更改效果

为什么useState触发具有相同值的呈现

使用getBorbingClientRect()更改绝对元素位置

使用带有HostBinding的Angular 信号来更新样式?

从另一个数组中的对应行/键值对更新数组中的键值对对象

如何限制显示在分页中的可见页面的数量

Next.js中的服务器端组件列表筛选

需要RTK-在ReactJS中查询多个组件的Mutations 数据

正则表达式以确定给定文本是否不只包含邮箱字符串

如何检测当前是否没有按下键盘上的键?

当达到高度限制时,如何裁剪图像?使用html和css

如何处理不带参数的redux thunk payloadCreator回调函数?

单击时同时 Select 和展开可访问的行