হালনাগাদ:
এই পোস্টের ভবিষ্যতের দর্শকদের সহায়তা করতে, আমি প্লুমার উত্তরটির এই ডেমোটি তৈরি করেছি ।
প্রশ্ন:
আমার লক্ষ্যটি মোটামুটি সোজা মনে হচ্ছে।
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()
এমডিএন-তে উদাহরণগুলি একই সমস্যার জন্য সমাধান দেখায়।