2013-10-30 4 views
6

पुन: https://github.com/tildeio/rsvp.jsकैसे हैंडल विफलता कॉलबैक की श्रृंखला के साथ वादा को अस्वीकार कर दिया rsvp.js

मैं) एक समारोह है कि थोड़ी देर के लिए कुछ एक RSVP.Promise रिटर्न करता है और उसके बाद DoSomething (कहा जाता है। फिर, सफलता और विफलता कॉलबैक की एक श्रृंखला लौटाई गई वादे के साथ पंजीकृत है (नीचे कोड देखें)। जिस व्यवहार से मुझे उम्मीद थी कि था, अगर वादा पूरा हो गया है, तो के साथ पंजीकृत सफलता कॉलबैक की श्रृंखला को वादा किया जाएगा, और अगर वादा खारिज कर दिया गया है (विफल रहता है), की विफलता कॉलबैक निकाल दी जाएगी।

मुझे वादा पूरा होने के लिए अपेक्षित व्यवहार मिलता है, लेकिन मुझे व्यवहार मिलता है जब वादा अस्वीकार कर दिया जाता है। यही है, सफलता कॉलबैक जंजीर हैं और एक सफलता कॉलबैक का आउटपुट पर श्रृंखला में अगली सफलता कॉलबैक पर भेज दिया गया है। लेकिन ऐसा लगता है कि विफलता कॉलबैक जंजीर नहीं हैं। वे कोशिश/पकड़ ब्लॉक में पकड़ की तरह व्यवहार करते हैं ( कोड और नीचे आउटपुट देखें)।

क्या कोई इस व्यवहार को समझा सकता है? क्या यह वास्तव में काम करने का अनुमान है, या यह है जिस तरह से rsvp.js एक अस्वीकार/असफल वादे को संभालता है जिसमें विफलता कॉलबैक की एक श्रृंखला है जिसके साथ पंजीकृत है? मैं अब कोशिश करने और इसे समझने के लिए वादे/ए + स्पेक पढ़ रहा हूं, लेकिन अगर कोई इस चीज को अपने सिर के ऊपर से जानता है, तो आपकी स्पष्टीकरण सुनना अच्छा लगेगा। अग्रिम में धन्यवाद।

jsfiddle: उत्पादन मैं मिलता है और उम्मीद http://jsfiddle.net/rylie/VYSj7/2/

doSomething() // returns an RSVP.Promise object 
    .then(
     function(message) { console.log("then success 1: " + message); return "from success 1"; }, // success callback 
     function(message) { console.log("then failure 1: " + message); return "from failure 1"; } // failure callback 
    ) 
    .then(
     function(message) { console.log("then success 2: " + message); return "from success 2"; }, // success callback 
     function(message) { console.log("then failure 2: " + message); return "from failure 2"; } // failure callback 
    ) 
    .then(
     function(message) { console.log("then success 3: " + message); return "from success 3"; } // success callback 
    ) 
    .then(
     null, 
     function(message) { console.log("then failure 4: " + message); return "from failure 4"; } // failure callback 
    ) 
    .then(
     function(message) { console.log("then success 5: " + message); return "from success 5"; }, // success callback 
     function(message) { console.log("then failure 5: " + message); return "from failure 5"; } // failure callback 
    ); 

** जब वादा निभाया है (सफल होता है), इस है:

then success 1: Promise fulfilled! 
then success 2: from success 1 
then success 3: from success 2 
then success 5: from success 3 

** जब वादा अस्वीकार कर दिया है (विफल रहता है), यह आउटपुट मुझे मिलता है:

then failure 1: Promise rejected! 
then success 2: from failure 1 
then success 3: from success 2 
then success 5: from success 3 

** यह मेरी अपेक्षा है (अस्वीकार पर/विफल वादा):

then failure 1: Promise rejected! 
then failure 2: from failure 1 
then failure 4: from failure 2 
then failure 5: from failure 4  

उत्तर

11

तुम बस भूल जाते हैं कि .then() भी 1 से अधिक तर्क लेता है और .catch विधि का उपयोग करें और इसे और अधिक समझ कर देगा।

वादे कुछ सिंक कोड संरचनाओं के लिए एक पत्राचार प्रदान करते हैं लेकिन यह बहुत दिखाई नहीं देता है जब आपके पास निम्न स्तर .then() होता है। जो आप खोज रहे हैं वह मूल रूप से कॉलबैक/कॉलबैक एकत्रीकरण की एक सरणी है लेकिन यह वादे का मुद्दा नहीं है।

की .catch(fn) ही .then(null, fn) के रूप में विचार करें:

doSomething().then(function(val) { 
    console.log(val); 
}).catch(function(e) { 
    console.error(e); 
}); 

समानताएं सिंक कोड (doSomething रिटर्न तुल्यकालिक कल्पना):

try { 
    var val = doSomething(); 
    console.log(val); 
} 
catch(e) { 
    console.error(e); 
} 

एकाधिक कैच (याद रखें कि .catch.then(null, fn)

को अधिक पठनीय अन्य नाम है
doSomething().then(function(val) { 
    console.log(val); 
}).catch(function(e) { 
    return e; 
}).catch(function(e){ 
    //Will not get here ever 
    //because error thrown from doSomething() 
    //was handled in the upper catch which doesn't trow 
}); 

समानताएं:

try { 
    try { 
     var val = doSomething(); 
     console.log(val); 
    } 
    catch(e) { 
     //no need for explicit return e 
    } 
} 
catch(e) { 
    //Will not get here ever 
    //because error thrown from doSomething() 
    //was handled in the upper catch which doesn't trow 
} 

तो अब आप नोटिस देना चाहिए कि आप के बजाय फेंक लौटने http://jsfiddle.net/VYSj7/3/

.catch() IMO प्रदान करने के लिए एक वादा पुस्तकालय के लिए एक अनिवार्य विधि है द्वारा अपेक्षित परिणाम बना सकते हैं और यह भी हो सकता है भविष्य में अंतर्निहित जावास्क्रिप्ट वादे में शामिल है।

Promise.prototype.catch = function(fn) { 
    return this.then(null, fn); 
}; 

भी देखें rejection turns into fulfillment

+0

अच्छा विवरण, Esailija: हालांकि, अगर इस तरह के विधि प्रदान नहीं की है, तो आप कर सकते हैं (या होना चाहिए, तो दुर्भाग्य से कार्यान्वयन कि प्रोटोटाइप का उपयोग नहीं करते हैं)! धन्यवाद। – RBR

संबंधित मुद्दे