顺序承诺

时间:2016-10-02 00:08:26

标签: javascript angularjs angular-promise

我需要获得四个响应的承诺,但为了做到这一点,我首先必须按顺序调用每个函数,从第一个到最后一个。你可以从我的代码中看到我在最后一个被调用函数的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); 
            });
    };

1 个答案:

答案 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,以便在发生错误时不会在链中继续。