首页 > 解决方案 > 是否有可能在 Promise.race() 和 Promise.all() 中获得以后的评估胜利,即使它们消耗相同的时间?

问题描述

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all,以下代码中的两个评估异步运行。

var p2 = Promise.all([1337, "hi"]); // non-promise values will be ignored, but the evaluation will be done asynchronously

在以下示例中,我想到了一个问题:

async function sleep(x) {
    await new Promise((resolve) => setTimeout(resolve, x))
}
async function test(x) {
    await sleep(1000);
    return x
}

async function run(){
    let promises = []
    promises.push(test(1))
    promises.push(test(2))
    let res = await Promise.race(promises)
    console.log(res)
}
run()
// I ran it for several times, and it always give me 1

由于这两个评估是异步运行的并且它们消耗相同的时间,这个程序是否有可能在某些情况下给我 2?

我不明白的是:

let a = 0
async function test1() {
    a++;
}
async function run(){
    let promises = []
    for (let i=0;i<100;i++){
        promises.push(test1())
    }
    await Promise.all(promises)
    console.log(a)
}
run()
// It always give me 100

它似乎从不违反原子性,为什么?

标签: javascriptmultithreading

解决方案


不。javascript中的事件循环是如何工作的,它将两个超时回调放在“超时队列”中,并且由于两个超时具有相同的超时延迟(1000),它们的回调将按照它们在“超时”中出现的顺序执行队列”。首先是“1”,然后是“2”。


推荐阅读