javascript - 是否有可能在 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?
我不明白的是:
- 为什么这个程序总是给我 1?如果多个评估消耗相同的时间,javascript 是否承诺较早的评估总是更早完成?
- 线程上下文切换是否发生在 Promise.all() 中?我尝试了另一个多线程示例代码,它总是给我 100。
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
它似乎从不违反原子性,为什么?
解决方案
不。javascript中的事件循环是如何工作的,它将两个超时回调放在“超时队列”中,并且由于两个超时具有相同的超时延迟(1000),它们的回调将按照它们在“超时”中出现的顺序执行队列”。首先是“1”,然后是“2”。
推荐阅读
- cqrs - 处理 CQRS 中的“有效”重复命令
- linux - 使用powershell将soap日志文件转换为csv
- python - LinkedList 对象不可迭代 - Python - “LinkedList”对象不可迭代
- ios - 使用 UITapGestureRecognizer 配置位置?
- html - 如何延迟关键帧动画
- c++ - Aeron 使用 RateSubscriber.cpp 从 CME UDP 多播获取费率
- python - Python 3.8.6 中的 ImportError
- compiler-errors - 在 C++ 中定义和使用 std::map 时出现编译错误
- c++ - 字符串擦除函数导致堆损坏
- swiftui - 更改焦点上 TextField 的样式(每个字段没有变量)