मैं अपने सिर को चारों ओर लपेटने के लिए प्रतीत नहीं हो सकता कि यह क्यों काम नहीं करता है।
क्योंकि 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वाक्यविन्यास के लिए चीनी के अलावा कुछ भी नहीं है ।