मैं अपने सिर को चारों ओर लपेटने के लिए प्रतीत नहीं हो सकता कि यह क्यों काम नहीं करता है।
क्योंकि main
प्रतिज्ञा लौटाता है; सभी async
कार्य करते हैं।
शीर्ष स्तर पर, आपको या तो होना चाहिए:
एक शीर्ष-स्तरीय async
फ़ंक्शन का उपयोग करें जो कभी भी अस्वीकार नहीं करता है (जब तक कि आप "अनहेल्ड रिजेक्शन" त्रुटियां नहीं चाहते हैं), या
का प्रयोग करें then
और catch
, या
(जल्द ही आ रहा है!) शीर्ष-स्तर काawait
उपयोग करें , एक प्रस्ताव जो इस प्रक्रिया में स्टेज 3 तक पहुंच गया है जो await
एक मॉड्यूल में शीर्ष-स्तरीय उपयोग की अनुमति देता है ।
# 1 - शीर्ष-स्तरीय async
फ़ंक्शन जो कभी अस्वीकार नहीं करता है
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
सूचना catch
; आपको वादे के खारिज / async अपवादों को संभालना चाहिए , क्योंकि कुछ भी नहीं होने जा रहा है; आपके पास उन्हें पास करने के लिए कोई कॉलर नहीं है। यदि आप चाहें, तो आप इसे catch
फ़ंक्शन के माध्यम से कॉल करने के परिणाम पर कर सकते हैं (बजाय try
/ catch
वाक्यविन्यास):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... जो थोड़ा अधिक संक्षिप्त है (मुझे उस कारण से पसंद है)।
या, ज़ाहिर है, त्रुटियों को संभालना नहीं है और बस "अनहेल्ड रिजेक्ट" त्रुटि की अनुमति दें।
# 2 - then
औरcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
catch
यदि त्रुटियों श्रृंखला में या अपने में होते हैं हैंडलर बुलाया जाएगा then
हैंडलर। (सुनिश्चित करें कि आपका catch
हैंडलर त्रुटियों को न फेंके, क्योंकि उन्हें संभालने के लिए कुछ भी पंजीकृत नहीं है।)
या दोनों तर्क then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
फिर से ध्यान दें कि हम एक अस्वीकृति हैंडलर को पंजीकृत कर रहे हैं। लेकिन इस रूप में, सुनिश्चित करें कि आपके then
किसी भी कॉलबैक में कोई त्रुटि नहीं है, उन्हें संभालने के लिए कुछ भी पंजीकृत नहीं है।
await
एक मॉड्यूल में # 3 शीर्ष-स्तर
आप await
एक गैर-मॉड्यूल स्क्रिप्ट के शीर्ष स्तर पर उपयोग नहीं कर सकते हैं , लेकिन शीर्ष-स्तरीय await
प्रस्ताव ( स्टेज 3 ) आपको एक मॉड्यूल के शीर्ष स्तर पर इसका उपयोग करने की अनुमति देता है। यह एक शीर्ष-स्तरीय async
फ़ंक्शन आवरण (# 1 ऊपर) का उपयोग करने के समान है , जिसमें आप अपने शीर्ष-स्तरीय कोड को अस्वीकार नहीं करना चाहते हैं (त्रुटि फेंकना) क्योंकि इसके परिणामस्वरूप अनहेल्ड अस्वीकृति त्रुटि होगी। इसलिए जब तक आप उस अनहेल्ड रिजेक्शन को नहीं चाहते हैं जब चीजें गलत हो जाती हैं, जैसा कि # 1 के साथ होता है, आप अपने कोड को किसी एरलर में लपेटना चाहेंगे:
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
ध्यान दें कि यदि आप ऐसा करते हैं, तो आपके मॉड्यूल से आयात होने वाला कोई भी मॉड्यूल इंतजार करेगा जब तक कि आप वादों को निपटा नहीं लेते await
; जब शीर्ष-स्तर await
का उपयोग करने वाले मॉड्यूल का मूल्यांकन किया जाता है, तो यह मूल रूप से मॉड्यूल लोडर (जैसे कोई async
फ़ंक्शन करता है) को एक वादा लौटाता है , जो तब तक इंतजार करता है जब तक कि उस पर निर्भर किसी भी मॉड्यूल के निकायों का मूल्यांकन करने से पहले उस वादे का निपटान नहीं किया जाता है।
await
वादाthen
वाक्यविन्यास के लिए चीनी के अलावा कुछ भी नहीं है ।