तो, मूल रूप से आप पूछ रहे हैं कि इन दोनों के बीच क्या अंतर है (जहां 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)
।