Atualizar:
Para ajudar os futuros telespectadores deste post, criei esta demonstração da resposta da pluma .
Questão:
Meu objetivo parece bastante direto.
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);
}
O problema aqui é que, se eu falhar na etapa 1, ambos stepError(1)
AND stepError(2)
serão acionados. Se não o fizer return $q.reject
, stepError(2)
não serei demitido, mas step(2)
sim, o que eu entendo. Eu realizei tudo, exceto o que estou tentando fazer.
Como escrevo promessas para poder chamar uma função de rejeição, sem chamar todas as funções na cadeia de erros? Ou existe outra maneira de conseguir isso?
Aqui está uma demonstração ao vivo para que você possa trabalhar com algo.
Atualizar:
Eu meio que resolvi isso. Aqui, estou capturando o erro no final da cadeia e passando os dados para, reject(data)
para saber o problema a ser tratado na função de erro. Na verdade, isso não atende aos meus requisitos, porque não quero depender dos dados. Seria ruim, mas no meu caso, seria mais limpo passar um retorno de chamada de erro para a função, em vez de depender dos dados retornados para determinar o que fazer.
Demonstração ao vivo aqui (clique).
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()
exemplos no MDN mostram a solução para exatamente os mesmos problemas.