"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > जावास्क्रिप्ट कब वादा करता है .then() हैंडलर एक दूसरे के संबंध में क्रियान्वयन करते हैं?

जावास्क्रिप्ट कब वादा करता है .then() हैंडलर एक दूसरे के संबंध में क्रियान्वयन करते हैं?

2024-12-11 को प्रकाशित
ब्राउज़ करें:877

When do JavaScript Promise .then() Handlers Execute in Relation to Each Other?

जावास्क्रिप्ट वादों में निष्पादन आदेश को समझना

जावास्क्रिप्ट में वादे एक अतुल्यकालिक प्रोग्रामिंग मॉडल प्रदान करते हैं जहां कोड को एक विशिष्ट घटना, या वादे के बाद निष्पादित किया जाता है , पूरा हो गया है। हालाँकि, कई वादों से निपटते समय, अप्रत्याशित व्यवहार से बचने के लिए निष्पादन के क्रम को समझना आवश्यक है।

निम्नलिखित कोड स्निपेट पर विचार करें:

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

निष्पादन आदेश को समझना

  1. वादे अतुल्यकालिक रूप से हल होते हैं:
    वादों को निष्पादन के वर्तमान धागे से स्वतंत्र रूप से हल किया जाता है। इसका मतलब यह है कि .then() हैंडलर को मौजूदा थ्रेड खत्म होने के बाद एसिंक्रोनस रूप से कॉल किया जाता है। हैंडलर पूरा करता है. वे अनिवार्य रूप से कतारबद्ध हैं, यही कारण है कि आप उस क्रम में 1, 2 "ए", और 3 "बी" मुद्रित देखते हैं।
  2. आंतरिक वादे स्वतंत्र श्रृंखला बनाते हैं:
    वादे बनाए गए नेस्टेड .then() हैंडलर के भीतर, जैसे Promise.resolve('C') और Promise.resolve('D'), नई, स्वतंत्र वादा श्रृंखलाएं बनाएं। ये आंतरिक श्रृंखलाएं स्वाभाविक रूप से बाहरी श्रृंखला के साथ सिंक्रनाइज़ नहीं होती हैं। इस मामले में, वादा इंजन लाइन 6 और 7 से पहले लाइन 5 और 12 पर .then() हैंडलर निष्पादित करना चुनता है।
  3. सिफारिशें
  4. निष्पादन का एक विशिष्ट क्रम सुनिश्चित करने के लिए, असिंक्रनाइज़्ड वादा श्रृंखला बनाने से बचें और इसके बजाय क्रमबद्ध तरीके से वादों को जोड़ने पर भरोसा करें। आंतरिक .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);
  5. इस दृष्टिकोण के साथ, निष्पादन क्रम पूरी तरह से नियतात्मक हो जाता है: 1, 2 "ए", 3 "बी", 7 "सी", 8 अपरिभाषित, 4 अपरिभाषित, 9 "डी", 10 अपरिभाषित, 5 अपरिभाषित, और 6.
विज्ञप्ति वक्तव्य यह आलेख यहां पुनर्मुद्रित है: 1729739979 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.कॉम से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3