TL; DR: Çünkü daha önce +=
okur x
, ancak değiştirildikten sonra await
, ikinci işlenenindeki (sağ taraftaki) anahtar kelime nedeniyle yazar .
async
ilk await
ifadeye kadar çağrıldığında işlevler eşzamanlı olarak çalışır .
Yani, kaldırırsanız await
, normal bir işlev gibi davranır (ancak bir Promise döndürmesi dışında).
Bu durumda, elde 5
ve 6
konsolda:
let x = 0;
async function test() {
x += 5;
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
Birincisi await
, argümanı senkronize olarak mevcut olsa bile senkronize çalışmayı durdurur, böylece aşağıdakiler geri döner 1
ve 6
beklediğiniz gibi:
let x = 0;
async function test() {
// Enter asynchrony
await 0;
x += 5;
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
Ancak, davanız biraz daha karmaşık.
Bunu await
kullanan bir ifadenin içine koydunuz +=
.
Muhtemelen bilirsiniz, JS'de bununla x += y
aynıdır x = (x + y)
. İkinci formu daha iyi anlamak için kullanacağım:
let x = 0;
async function test() {
x = (x + await 5);
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
Tercüman bu çizgiye ulaştığında ...
x = (x + await 5);
... değerlendirmeye başlar ve ...
x = (0 + await 5);
... sonra ulaşır await
ve durur.
İşlev çağrısından sonraki kod çalışmaya başlar ve değerini değiştirir x
, sonra günlüğe kaydeder.
x
şimdi 1
.
Ardından, ana komut dosyası çıktıktan sonra, yorumlayıcı duraklatılmış test
işleve geri döner ve bu satırı değerlendirmeye devam eder:
x = (0 + 5);
Ve, değeri x
zaten ikame edildiğinden, kalır 0
.
Son olarak, tercüman toplama, mağaza yapar 5
için x
ve bunu kaydeder.
Bir nesne özelliği alıcı / ayarlayıcısının içine giriş yaparak bu davranışı kontrol edebilirsiniz (bu örnekte, y.z
değerini yansıtır x
:
let x = 0;
const y = {
get z() {
console.log('get x :', x);
return x;
},
set z(value) {
console.log('set x =', value);
x = value;
}
};
async function test() {
console.log('inside async function');
y.z += await 5;
console.log('x :', x);
}
test();
console.log('main script');
y.z += 1;
console.log('x :', x);
/* Output:
inside async function
get x : 0 <-- async fn reads
main script
get x : 0
set x = 1
x : 1
set x = 5 <-- async fn writes
x : 5 <-- async fn logs
*/
/* Just to make console fill the available space */
.as-console-wrapper {
max-height: 100% !important;
}
await (x += 5)
Ve arasındaki farkı bilmelisinizx += await 5
.