ES6

2015-09-27 43 views
5

में वादा श्रृंखला के बारे में मुझे ES6 में वादा श्रृंखला के बारे में भ्रम मिला।ES6

function taskA() { 
 
    console.log("Task A"); 
 
    throw new Error("throw Error @ Task A") 
 
} 
 

 
function taskB() { 
 
    console.log("Task B"); 
 
} 
 

 
function onRejected(error) { 
 
 console.log(error);// => "throw Error @ Task A" 
 
} 
 
    
 
function finalTask() { 
 
    console.log("Final Task"); 
 
} 
 

 
var promise = Promise.resolve(); 
 
promise 
 
.then(taskA) 
 
.then(taskB) 
 
.catch(onRejected) 
 
.then(finalTask);

मैं यहाँ क्या खो रहा हूँ क्यों finalTask बुलाया जाएगा है? catch() श्रृंखला एक हल वादा करता है?

+0

संभावित डुप्लिकेट [अस्वीकृत वादे अस्वीकार करने से गुजरने वाले] [http://stackoverflow.com/q/16371129/1048572) – Bergi

उत्तर

13

जब आप .catch() हैंडलर प्रदान करते हैं या .then() के लिए दूसरा तर्क देते हैं, तो अस्वीकृत वादा "संभाला गया" है। डिफ़ॉल्ट रूप से, जब आप इस तरह के एक अस्वीकार हैंडलर प्रदान करते हैं, तो वादा प्रणाली मान लेगी कि अस्वीकृति को संभाला गया है और श्रृंखला जारी रहनी चाहिए।

यदि आप श्रृंखला जारी रखना नहीं चाहते हैं, तो अस्वीकार हैंडलर से, आप या तो अस्वीकार किए गए वादे को वापस कर सकते हैं या एक त्रुटि फेंक सकते हैं। उस श्रृंखला में एक और अस्वीकार हैंडलर तक तब तक उस श्रृंखला को तब तक रोक देगा।

तो, यहाँ आप की तरह एक श्रृंखला में संभावनाएं हैं दिखाने:

1) कोई श्रृंखला

में हैंडलर अस्वीकार श्रृंखला पूरी तरह से बंद कर दिया है और आगे कोई .then() पूरा संचालकों क्रियान्वित कर रहे हैं है ।

2) श्रृंखला में एक अस्वीकार हैंडलर है जो या तो कुछ भी नहीं देता है या नियमित मूल्य या पूरा वादा या अंततः पूरा करने वाला वादा देता है।

यह आपका कोड वर्तमान में दिखाता है। अस्वीकार को संभाला माना जाता है और श्रृंखला का वादा राज्य एक पूर्ण वादे में बदल जाता है ताकि श्रृंखला में बाद में पूरा करने वाले हैंडलर को बुलाया जा सके।

3) वहाँ एक श्रृंखला है कि या तो एक को अस्वीकार कर दिया वादा रिटर्न या कोई त्रुटि

को अस्वीकार कर दिया वादा (या एक वादा है कि भविष्य में खारिज कर दिया रिटर्निंग) या एक नया त्रुटि फेंक (फेंकता में हैंडलर अस्वीकार है जो अस्वीकार वादे में बदल जाता है) अगले त्रुटि हैंडलर तक श्रृंखला के आगे प्रसंस्करण को रोक देगा।

तो, अगर आप इस के लिए अपने onRejected() हैंडलर बदल दिया है:

function onRejected(error) { 
  console.log(error); 
    throw error; // rethrow error to stop the rest of the chain 
} 

फिर, अपने वादे श्रृंखला वहाँ बंद कर देंगे।


यह समझना महत्वपूर्ण है कि यह इस तरह क्यों काम करता है। यह आपको वादे श्रृंखला के बीच में एक त्रुटि को संभालने की अनुमति देता है और त्रुटि को संभालने वाले कोड को यह तय करने के लिए मिलता है कि श्रृंखला जारी है या नहीं, जो यह लौटती है या फेंकता है। यदि यह कुछ भी नहीं या सामान्य मूल्य या पूरा वादा देता है, तो श्रृंखला की प्रसंस्करण जारी है - त्रुटि को संभाला गया है - आगे की प्रक्रिया को रोकने की कोई आवश्यकता नहीं है।

लेकिन, यदि त्रुटि उस से अधिक गंभीर है और प्रसंस्करण जारी नहीं रहना चाहिए, तो अस्वीकार हैंडलर या तो एक ही त्रुटि फेंक सकता है या एक अलग त्रुटि फेंक सकता है या एक अस्वीकार वादा वापस कर सकता है और श्रृंखला किसी भी पूर्ण हैंडलर को तब तक छोड़ देगी चेन में अगला अस्वीकार हैंडलर।

+1

बहुत बहुत धन्यवाद! आपकी व्याख्या बहुत स्पष्ट है। – JasmineOT

+2

यह सिंक्रोनस 'try {} catch (e) {}' में इस तरह से 'पकड़' के समान है (त्रुटि को तब तक संभाला जाता है जब तक कि पुनर्स्थापना न हो)। – jib