TL; DR: Çünkü daha önce +=okur x, ancak değiştirildikten sonra await, ikinci işlenenindeki (sağ taraftaki) anahtar kelime nedeniyle yazar .
asyncilk awaitifadeye 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 5ve 6konsolda:
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 1ve 6beklediğ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 awaitkullanan bir ifadenin içine koydunuz +=.
Muhtemelen bilirsiniz, JS'de bununla x += yaynı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 awaitve 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ış testişleve geri döner ve bu satırı değerlendirmeye devam eder:
x = (0 + 5);
Ve, değeri xzaten ikame edildiğinden, kalır 0.
Son olarak, tercüman toplama, mağaza yapar 5için xve bunu kaydeder.
Bir nesne özelliği alıcı / ayarlayıcısının içine giriş yaparak bu davranışı kontrol edebilirsiniz (bu örnekte, y.zdeğ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.