Güncelleme:
Bu yazının gelecekteki izleyicilerine yardımcı olmak için bu pluma cevabının demosunu oluşturdum .
Soru:
Hedefim oldukça açık görünüyor.
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);
}
Buradaki sorun, 1. adımda başarısız olursam, her iki stepError(1)
AND'in stepError(2)
de tetiklenmesidir. Eğer return $q.reject
o stepError(2)
zaman kovulmayacağım, ama step(2)
anlayacağım. Yapmaya çalıştığım şeyler dışında her şeyi başardım.
Hata zincirindeki tüm işlevleri çağırmadan reddedilme işlevini çağırabilmem için nasıl söz verebilirim? Yoksa bunu başarmanın başka bir yolu var mı?
İşte canlı demo Birlikte işe yarayacak bir şey var bu yüzden.
Güncelleme:
Ben biraz bunu çözmüş. Burada, zincirin sonunda hata yakalamak ve veri iletmek reject(data)
böylece ben hata fonksiyonu ele almak için hangi sorunu bilecek. Verilere bağlı kalmak istemediğim için bu aslında gereksinimlerimi karşılamıyor. Topal olurdu, ancak benim durumumda, ne yapılacağını belirlemek için döndürülen verilere bağlı kalmak yerine işleve bir hata geri çağrısı iletmek daha temiz olurdu.
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()
MDN örnekleri aynı sorunların çözümünü göstermektedir.