2016-10-02 18 views
0

私は4つの応答の約束を得る必要がありますが、これを行うには最初にすべての関数を最初から最後まで順番に呼び出す必要があります。私のコードから、最後に呼ばれた関数からの約束コールバックの次の関数を呼び出すことができます。逐次約束

しかし、コードは適切ではないので、これを行うにはもっと良い方法があるかどうかを知る必要があります。

提案がありますか?

$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

私はあなたが約束を返す機能を支配しているかどうかわかりません。あなたがそうするなら、私はそれらを再加工することを考えて、あまりにも多くの非同期のものを避けることができます。私は約束を複数回入れなければならないと、いつも赤旗を考えています。 –

答えて

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"); 
    }); 

この同じパターンをコードで使用できます。

エラーを捕捉するには、チェインのすべてのエラーに対して1つのエラーハンドラが必要な場合は、チェーンの最後に.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を呼び出す必要があります。

+0

ありがとうございます@afuous エラーレスポンスはどうですか?それをどうやって手に入れますか? – vinoli

+0

@vinoli私の編集を参照 – afuous

+0

申し訳ありませんが、回答ごとに別々のエラーメッセージを表示したいのですが? – vinoli