तो, मूल रूप से आप पूछ रहे हैं कि इन दोनों के बीच क्या अंतर है (जहां pकुछ पिछले कोड से बनाया गया वादा है):
return p.then(...).catch(...);
तथा
return p.catch(...).then(...);
P के हल होने या अस्वीकार होने पर या तो अंतर होते हैं, लेकिन क्या वे अंतर मायने रखते हैं या नहीं यह इस बात पर निर्भर करता है कि कोड .then()या .catch()हैंडलर अंदर क्या करता है।
जब pहल होता है तो क्या होता है :
पहली योजना में, जब pहल होता है, तो .then()हैंडलर कहा जाता है। यदि वह .then()हैंडलर या तो एक मूल्य लौटाता है या एक और वादा जो अंततः हल हो जाता है, तो .catch()हैंडलर छोड़ दिया जाता है। लेकिन, यदि .then()हैंडलर या तो एक वादे को फेंकता है या वापस करता है, जो अंततः अस्वीकार कर देता है, तो .catch()हैंडलर मूल वादे में दोनों को खारिज कर देगा p, लेकिन .then()हैंडलर में एक त्रुटि भी होती है ।
दूसरी योजना में, जब pहल होता है, तो .then()हैंडलर कहा जाता है। यदि वह .then()हैंडलर या तो एक वादा पूरा करता है या वापस करता है, जो अंततः खारिज कर देता है, तो .catch()हैंडलर उसे पकड़ नहीं सकता है क्योंकि यह श्रृंखला में उसके पहले है।
तो, यह अंतर # 1 है। यदि .catch()हैंडलर AFTER है, तो यह .then()हैंडलर के अंदर त्रुटियों को भी पकड़ सकता है ।
pअस्वीकार होने पर क्या होता है :
अब, पहली योजना में, यदि वादे pको अस्वीकार कर दिया जाता है, तो .then()हैंडलर को छोड़ दिया जाता है और .catch()हैंडलर को बुलाया जाएगा जैसा कि आप उम्मीद करेंगे। आप .catch()हैंडलर में क्या करते हैं, यह निर्धारित करता है कि अंतिम परिणाम के रूप में क्या लौटाया गया है। यदि आप बस .catch()हैंडलर से एक मान लौटाते हैं या एक वादा वापस करते हैं जो अंततः हल हो जाता है, तो वादा श्रृंखला हल की हुई स्थिति में चली जाती है क्योंकि आप त्रुटि को "हैंडल" करते हैं और सामान्य रूप से वापस आ जाते हैं। यदि आप .catch()हैंडलर में अस्वीकार किए गए वादे को फेंकते हैं या वापस करते हैं , तो वापस किया गया वादा अस्वीकृत हो जाता है।
दूसरी योजना में, यदि वादा pअस्वीकार होता है, तो .catch()हैंडलर को बुलाया जाता है। यदि आप एक सामान्य मान या एक वादा वापस करते हैं जो अंततः .catch()हैंडलर से हल होता है (इस प्रकार "त्रुटि को संभालना"), तो वादा श्रृंखला हल की स्थिति में स्विच हो जाती है और .then()हैंडलर को .catch()बुलाया जाएगा।
तो यह अंतर # 2 है। यदि .catch()हैंडलर BEFORE है, तो यह त्रुटि को संभाल सकता है और .then()हैंडलर को अभी भी कॉल करने की अनुमति दे सकता है।
कब कौन सा उपयोग करें:
पहली योजना का उपयोग करें यदि आप सिर्फ एक .catch()हैंडलर चाहते हैं जो मूल वादे pया .then()हैंडलर में त्रुटियों को पकड़ सकता है और हैंडलर pको छोड़ देना चाहिए .then()।
दूसरी योजना का उपयोग करें यदि आप मूल वादे में त्रुटियों को पकड़ने में सक्षम होना चाहते हैं pऔर शायद (शर्तों के आधार पर), वादा श्रृंखला को हल करने के लिए जारी रखने की अनुमति दें, इस प्रकार .then()हैंडलर को निष्पादित करना ।
दूसरा विकल्प
दोनों कॉलबैक का उपयोग करने के लिए एक अन्य विकल्प है जिसे आप निम्न में से पास कर सकते हैं .then():
p.then(fn1, fn2)
यह गारंटी देता है कि केवल एक fn1या fn2कभी भी बुलाया जाएगा। अगर pठान ले तो कहलाएगा fn1। यदि pअस्वीकार fn2किया जाता है , तो बुलाया जाएगा। परिणाम में कोई परिवर्तन fn1कभी भी fn2बुलाया या इसके विपरीत नहीं हो सकता है। इसलिए, यदि आप पूरी तरह से सुनिश्चित करना चाहते हैं कि आपके दो हैंडलर में से केवल एक को ही बुलाया जाए, भले ही हैंडलर में क्या होता है तो आप इसका उपयोग कर सकते हैं p.then(fn1, fn2)।