Cập nhật:
Để giúp những người xem trong tương lai của bài đăng này, tôi đã tạo bản demo câu trả lời này .
Câu hỏi:
Mục tiêu của tôi có vẻ khá đơn giản.
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);
}
Vấn đề ở đây là nếu tôi thất bại ở bước 1, cả stepError(1)
AND stepError(2)
đều bị sa thải. Nếu tôi làm không return $q.reject
thì stepError(2)
sẽ không bị sa thải, nhưng step(2)
sẽ, mà tôi hiểu được. Tôi đã hoàn thành mọi thứ trừ những gì tôi đang cố gắng làm.
Làm cách nào để viết lời hứa để tôi có thể gọi một hàm từ chối, mà không gọi tất cả các hàm trong chuỗi lỗi? Hoặc có một cách khác để thực hiện điều này?
Đây là một bản demo trực tiếp để bạn có một cái gì đó làm việc với.
Cập nhật:
Tôi loại đã giải quyết nó. Ở đây, tôi đang bắt lỗi ở cuối chuỗi và chuyển dữ liệu tới reject(data)
để tôi sẽ biết vấn đề nào cần xử lý trong hàm lỗi. Điều này thực sự không đáp ứng yêu cầu của tôi vì tôi không muốn phụ thuộc vào dữ liệu. Sẽ là khập khiễng, nhưng trong trường hợp của tôi, việc chuyển một cuộc gọi lại lỗi cho hàm sẽ tốt hơn thay vì phụ thuộc vào dữ liệu được trả về để xác định việc cần làm.
Bản demo trực tiếp tại đây (click).
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()
các ví dụ về MDN hiển thị giải pháp cho các vấn đề chính xác tương tự.