根據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
它似乎永遠不會違反原子性,為什么?
uj5u.com熱心網友回復:
不。javascript中的事件回圈是如何作業的,它會將兩個超時回呼放在“超時佇列”中,并且由于兩個超時具有相同的超時延遲(1000),因此它們的回呼將按照它們在“超時”中出現的順序執行佇列”。先是“1”,然后是“2”。
uj5u.com熱心網友回復:
為什么這個程式總是給我 1?如果多個評估消耗相同的時間,javascript 是否承諾較早的評估總是更早完成?
另一個答案回答了這個問題——超時按照它們放入佇列的順序得到解決。無論如何,2promise的超時期限總是比 promise的超時期限晚1,因為在promises.push(test(1))和之間會經過一段時間promises.push(test(2))。
第二個問題:
Promise.all() 中是否會發生執行緒背景關系切換?我嘗試了另一個多執行緒示例代碼,它總是給我 100。
不,您沒有嘗試多執行緒,因為常規 JavaScript 中沒有多執行緒。
一個async函式在第一個函式之前是同步的await(并且將它的回傳值添加到一個 promise 中),所以
async function test1() {
a ;
// implicit return undefined;
}
相當于
function test1() {
a ;
return Promise.resolve(undefined);
}
這意味著
async function run() {
let promises = []
for (let i = 0; i < 100; i ) {
promises.push(test1())
}
await Promise.all(promises)
console.log(a)
}
相當于
async function run() {
let promises = []
for (let i = 0; i < 100; i ) {
a ;
promises.push(Promise.resolve(undefined));
}
await Promise.all(promises);
console.log(a);
}
這在修改a.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349303.html
標籤:javascript 多线程
下一篇:信號量中的原子指令
