
जावास्क्रिप्ट वादों में निष्पादन आदेश को समझना
जावास्क्रिप्ट में वादे एक अतुल्यकालिक प्रोग्रामिंग मॉडल प्रदान करते हैं जहां कोड को एक विशिष्ट घटना, या वादे के बाद निष्पादित किया जाता है , पूरा हो गया है। हालाँकि, कई वादों से निपटते समय, अप्रत्याशित व्यवहार से बचने के लिए निष्पादन के क्रम को समझना आवश्यक है।
निम्नलिखित कोड स्निपेट पर विचार करें:
Promise.resolve('A')
.then(function(a){console.log(2, a); return 'B';})
.then(function(a){
Promise.resolve('C')
.then(function(a){console.log(7, a);})
.then(function(a){console.log(8, a);});
console.log(3, a);
return a;})
.then(function(a){
Promise.resolve('D')
.then(function(a){console.log(9, a);})
.then(function(a){console.log(10, a);});
console.log(4, a);})
.then(function(a){
console.log(5, a);});
console.log(1);
setTimeout(function(){console.log(6)},0);
निष्पादन पर, आप आउटपुट के निम्नलिखित क्रम को देख सकते हैं:
1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6
निष्पादन आदेश को समझना
- वादे अतुल्यकालिक रूप से हल होते हैं:
वादों को निष्पादन के वर्तमान धागे से स्वतंत्र रूप से हल किया जाता है। इसका मतलब यह है कि .then() हैंडलर को मौजूदा थ्रेड खत्म होने के बाद एसिंक्रोनस रूप से कॉल किया जाता है। हैंडलर पूरा करता है. वे अनिवार्य रूप से कतारबद्ध हैं, यही कारण है कि आप उस क्रम में 1, 2 "ए", और 3 "बी" मुद्रित देखते हैं। - आंतरिक वादे स्वतंत्र श्रृंखला बनाते हैं:
वादे बनाए गए नेस्टेड .then() हैंडलर के भीतर, जैसे Promise.resolve('C') और Promise.resolve('D'), नई, स्वतंत्र वादा श्रृंखलाएं बनाएं। ये आंतरिक श्रृंखलाएं स्वाभाविक रूप से बाहरी श्रृंखला के साथ सिंक्रनाइज़ नहीं होती हैं। इस मामले में, वादा इंजन लाइन 6 और 7 से पहले लाइन 5 और 12 पर .then() हैंडलर निष्पादित करना चुनता है। - सिफारिशें
- निष्पादन का एक विशिष्ट क्रम सुनिश्चित करने के लिए, असिंक्रनाइज़्ड वादा श्रृंखला बनाने से बचें और इसके बजाय क्रमबद्ध तरीके से वादों को जोड़ने पर भरोसा करें। आंतरिक .then() हैंडलर से वादों को वापस करें ताकि उन्हें मूल वादे के साथ जोड़ा जा सके, जैसा कि नीचे दिखाया गया है:Promise.resolve('A').then(function (a) {
कंसोल.लॉग(2, ए);
वापसी 'बी';
}).तब(फ़ंक्शन (ए) {
var p = Promise.resolve('C').then(function (a) {
कंसोल.लॉग(7, ए);
}).तब(फ़ंक्शन (ए) {
कंसोल.लॉग(8, ए);
});
कंसोल.लॉग(3, ए);
वापसी पी; // आंतरिक वादे को मूल श्रृंखला से लिंक करें
}).तब(फ़ंक्शन (ए) {
var p = Promise.resolve('D').then(function (a) {
कंसोल.लॉग(9, ए);
}).तब(फ़ंक्शन (ए) {
कंसोल.लॉग(10, ए);
});
कंसोल.लॉग(4, ए);
वापसी पी; // आंतरिक वादे को मूल श्रृंखला से लिंक करें
}).तब(फ़ंक्शन (ए) {
कंसोल.लॉग(5, ए);
});
कंसोल.लॉग(1);
सेटटाइमआउट(फ़ंक्शन() {
कंसोल.लॉग(6)
}, 0);
इस दृष्टिकोण के साथ, निष्पादन क्रम पूरी तरह से नियतात्मक हो जाता है: 1, 2 "ए", 3 "बी", 7 "सी", 8 अपरिभाषित, 4 अपरिभाषित, 9 "डी", 10 अपरिभाषित, 5 अपरिभाषित, और 6.