我需要获得四个响应的承诺,但为了做到这一点,我首先必须按顺序调用每个函数,从第一个到最后一个。你可以从我的代码中看到我在最后一个被调用函数的promise回调中调用了下一个函数。
但代码看起来不合适,所以我需要知道是否有更好的方法来做到这一点。
有什么建议吗?
$scope.createPayment = function() {
var dados = $scope.card;
// get first promise
PagamentoMP.createToken(dados)
.then(
function(result) {
dados.token = result;
// get second promise
PagamentoMP.guessPaymentMethod(dados)
.then(
function(result) {
dados.paymentMethod = result;
// get third promise
PagamentoMP.getIssuers(dados)
.then(
function(result) {
dados.issuer = result;
// get fourth promise
PagamentoMP.getInstallments(dados)
.then(
function(result) {
dados.installments = result;
},
// error for fourth promise
function(result) {
console.log("getInstallments PAGAMENTOMP -> Failed to get the name, result is " + result);
}
);
},
// error for third promise
function(result) {
console.log("getIssuers PAGAMENTOMP -> Failed to get the name, result is " + result);
});
},
// error for second promise
function(result) {
console.log("guessPaymentMethod PAGAMENTOMP -> Failed to get the name, result is " + result);
});
},
// error for first promise
function(result) {
console.log("createToken PAGAMENTOMP -> Failed to get the name, result is " + result);
});
};
答案 0 :(得分:1)
而不是这样做,
a().then(function(result) {
b(result).then(function(result) {
c(result).then(function(result) {
console.log("done");
});
});
});
你可以在顶层链接所有的承诺。
a()
.then(function(result) {
return b(result);
})
.then(function(result) {
return c(result);
})
.then(function(result) {
console.log("done");
});
您的代码中可以使用相同的模式。
要捕获错误,如果您想为链中的所有错误配置一个错误处理程序,请在链的末尾添加.catch
。
a()
.then(function(result) {
console.log("done");
})
.catch(function(err) {
console.error(err);
});
对于每个步骤的单独错误处理程序,您可以执行以下操作:
a()
.catch(function(err) {
console.log("error in a");
throw err;
})
.then(function(result) {
return b()
.catch(function(err) {
console.log("error at b");
throw err;
});
})
.then(function(result) {
return c()
.catch(function(err) {
console.log("error at c");
throw;
});
});
每个错误处理程序都需要调用throw
,以便在发生错误时不会在链中继续。