TL; DR: क्योंकि पहले +=पढ़ता है x, लेकिन इसे बदलने के बाद इसे लिखता है, awaitइसके दूसरे ऑपरेंड में कीवर्ड के कारण (राइट-हैंड साइड)।
asyncजब वे पहले awaitबयान तक बुलाए जाते हैं तो फ़ंक्शन सिंक्रोनस रूप से चलते हैं ।
इसलिए, यदि आप हटाते हैं await, तो यह एक सामान्य फ़ंक्शन (अपवाद के साथ व्यवहार करता है कि यह अभी भी एक वादा करता है)।
उस स्थिति में, आप प्राप्त करते हैं 5और 6कंसोल में हैं:
let x = 0;
async function test() {
x += 5;
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
पहला awaitसिंक्रोनस रनिंग बंद कर देता है, भले ही उसका तर्क समकालिक रूप से उपलब्ध हो, इसलिए निम्न वापसी होगी 1और 6, जैसा कि आप उम्मीद करते हैं:
let x = 0;
async function test() {
// Enter asynchrony
await 0;
x += 5;
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
हालाँकि, आपका मामला थोड़ा अधिक जटिल है।
आपने awaitएक अभिव्यक्ति के अंदर रखा है, जो उपयोग करता है +=।
तुम्हें शायद पता है, कि जेएस x += yमें समान है x = (x + y)। मैं बेहतर समझ के लिए बाद के फॉर्म का उपयोग करूंगा:
let x = 0;
async function test() {
x = (x + await 5);
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
जब दुभाषिया इस रेखा तक पहुँचता है ...
x = (x + await 5);
... इसका मूल्यांकन शुरू होता है, और यह ...
x = (0 + await 5);
... तो, यह तक पहुँचता है awaitऔर बंद हो जाता है।
फ़ंक्शन कॉल के बाद कोड चलने लगता है, और मान को संशोधित करता है x, फिर उसे लॉग करता है।
xअब है 1।
फिर, मुख्य स्क्रिप्ट से बाहर निकलने के बाद, दुभाषिया वापस चल testसमारोह में जाता है, और उस रेखा का मूल्यांकन जारी रखता है:
x = (0 + 5);
और, चूंकि मूल्य xको पहले से प्रतिस्थापित किया गया है, इसलिए यह बना हुआ है 0।
अंत में, दुभाषिया अलावा करता है, दुकानों 5के लिए x, और यह लॉग करता है।
आप किसी ऑब्जेक्ट गुण गेट्टर / सेटर के अंदर लॉग इन करके इस व्यवहार की जाँच कर सकते हैं (इस उदाहरण में, y.zइसका मान दर्शाता है 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)और के बीच का अंतर पता होना चाहिएx += await 5।