Aggiornare:
Per aiutare i futuri spettatori di questo post, ho creato questa demo della risposta di Pluma .
Domanda:
Il mio obiettivo sembra abbastanza semplice.
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);
}
Il problema qui è che se fallisco nel passaggio 1, entrambi stepError(1)
AND stepError(2)
vengono attivati. Se non lo faccio return $q.reject
allorastepError(2)
non saranno licenziati, ma step(2)
volontà, che ho capito. Ho realizzato tutto tranne ciò che sto cercando di fare.
Come faccio a scrivere promesse per poter chiamare una funzione in caso di rifiuto, senza chiamare tutte le funzioni nella catena di errori? O c'è un altro modo per farlo?
Ecco una demo dal vivo quindi hai qualcosa con cui lavorare.
Aggiornare:
Ho sorta di aver risolto. Qui, sto rilevando l'errore alla fine della catena e passando i dati in reject(data)
modo da sapere quale problema gestire nella funzione di errore. Questo in realtà non soddisfa i miei requisiti perché non voglio dipendere dai dati. Sarebbe zoppo, ma nel mio caso sarebbe più pulito passare un callback di errore alla funzione piuttosto che dipendere dai dati restituiti per determinare cosa fare.
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()
esempi su MDN mostrano la soluzione per gli stessi identici problemi.