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
।