อัปเดต:
เพื่อช่วยผู้ชมโพสต์นี้ในอนาคตฉันได้สร้างตัวอย่างคำตอบของ plumaนี้
คำถาม:
เป้าหมายของฉันค่อนข้างตรงไปตรงมา
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)
AND 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);
}