अपडेट करें:
इस पोस्ट के भविष्य के दर्शकों की मदद करने के लिए, मैंने आघात के उत्तर का यह डेमो बनाया ।
सवाल:
मेरा लक्ष्य काफी सीधा लगता है।
step(1)
.then(function() {
return step(2);
}, function() {
stepError(1);
return $q.reject();
})
.then(function() {
}, function() {
stepError(2);
});
function step(n) {
var deferred = $q.defer();
//fail on step 1
(n === 1) ? deferred.reject() : deferred.resolve();
return deferred.promise;
}
function stepError(n) {
console.log(n);
}
समस्या यहाँ है कि अगर मैं चरण 1 पर असफल, दोनों है stepError(1)
और stepError(2)
निकाल दिया जाता है। अगर मैं नहीं return $q.reject
तो stepError(2)
निकाल दिया step(2)
जाएगा, लेकिन होगा, जो मैं समझता हूँ। मैंने जो कुछ करने की कोशिश की है, उसे छोड़कर मैंने सब कुछ पूरा कर लिया है।
मैं वादे कैसे लिखूं ताकि मैं त्रुटि श्रृंखला में सभी फ़ंक्शन को कॉल किए बिना, अस्वीकृति पर एक फ़ंक्शन कह सकूं? या इसे पूरा करने का कोई और तरीका है?
यहाँ एक लाइव डेमो है ताकि आपको कुछ काम मिल सके।
अपडेट करें:
मैं एक तरह से इसे हल कर दिया है। यहां, मैं श्रृंखला के अंत में त्रुटि को पकड़ रहा हूं और डेटा को पास कर reject(data)
रहा हूं ताकि मुझे पता चल जाएगा कि त्रुटि फ़ंक्शन में क्या समस्या है। यह वास्तव में मेरी आवश्यकताओं को पूरा नहीं करता है क्योंकि मैं डेटा पर निर्भर नहीं होना चाहता। यह लंगड़ा होगा, लेकिन मेरे मामले में यह कार्य करने के लिए दिए गए डेटा पर निर्भर होने के बजाय फ़ंक्शन में त्रुटि कॉलबैक पास करने के लिए क्लीनर होगा।
step(1)
.then(function() {
return step(2);
})
.then(function() {
return step(3);
})
.then(false,
function(x) {
stepError(x);
}
);
function step(n) {
console.log('Step '+n);
var deferred = $q.defer();
(n === 1) ? deferred.reject(n) : deferred.resolve(n);
return deferred.promise;
}
function stepError(n) {
console.log('Error '+n);
}
Promise.prototype.catch()
एमडीएन पर उदाहरण सटीक मुद्दों के लिए समाधान दिखाते हैं।