क्या फर्क पड़ता है?
.then()
कॉल एक वादा है कि मामले में कॉलबैक एक त्रुटि फेंकता अस्वीकार कर दिया जाएगा वापस आ जाएगी। इसका मतलब है, जब आपकी सफलता logger
विफल हो जाती है, तो त्रुटि निम्नलिखित .catch()
कॉलबैक को पारित की जाएगी , लेकिन fail
कॉलबैक के साथ नहीं जो साथ जाती है success
।
यहाँ एक नियंत्रण प्रवाह आरेख है:
इसे समकालिक कोड में व्यक्त करने के लिए:
// some_promise_call().then(logger.log, logger.log)
then: {
try {
var results = some_call();
} catch(e) {
logger.log(e);
break then;
} // else
logger.log(results);
}
दूसरा log
(जो पहले तर्क की तरह है .then()
) केवल उस मामले में निष्पादित किया जाएगा जब कोई अपवाद नहीं हुआ। लेबल ब्लॉक और break
स्टेटमेंट थोड़ा अजीब लगता है, यह वास्तव में अजगर के try-except-else
लिए क्या है (अनुशंसित पढ़ने!)।
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
catch
लकड़हारा भी सफलता लकड़हारा कॉल से अपवादों को संभाल लेंगे।
अंतर के लिए इतना।
मैं कोशिश और पकड़ के रूप में इसके स्पष्टीकरण को काफी नहीं समझता
तर्क यह है कि आमतौर पर आप प्रसंस्करण के हर चरण में त्रुटियों को पकड़ना चाहते हैं, और यह कि आप इसे जंजीरों में इस्तेमाल नहीं करें। उम्मीद यह है कि आपके पास केवल एक अंतिम हैंडलर है जो सभी त्रुटियों को संभालता है - जबकि, जब आप "एंटीपैटर्न" का उपयोग करते हैं, तो कुछ कॉलबैक में त्रुटियों को संभाला नहीं जाता है।
हालांकि, यह पैटर्न वास्तव में बहुत उपयोगी है: जब आप इस चरण में हुई त्रुटियों को संभालना चाहते हैं, और आप कोई त्रुटि नहीं होने पर पूरी तरह से कुछ अलग करना चाहते हैं - यानी जब त्रुटि अप्राप्य हो। ध्यान रखें कि यह आपके नियंत्रण प्रवाह को तोड़ रहा है । बेशक, यह कभी-कभी वांछित होता है।
इसके बाद क्या गलत है?
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
कि आपको अपना कॉलबैक दोहराना था। आप बल्कि चाहते हैं
some_promise_call()
.catch(function(e) {
return e; // it's OK, we'll just log it
})
.done(function(res) {
logger.log(res);
});
आप इसके .finally()
लिए उपयोग करने पर भी विचार कर सकते हैं ।
then().catch()
अधिक पठनीय है, क्योंकि आपको अल्पविराम की तलाश करने की आवश्यकता नहीं है और जांच यह है कि सफलता या असफल शाखा के लिए यह कॉलबैक है।