2016-10-02 5 views
0

Ich brauche vier Versprechen zu versprechen, aber um dies zu tun, muss ich zuerst jede Funktion in der Reihenfolge von der ersten bis zur letzten aufrufen. Sie können aus meinem Code sehen, dass ich die nächste Funktion im Callback-Versprechen von der zuletzt aufgerufenen Funktion aufruft.Sequentielle Versprechen

Aber der Code sieht nicht angemessen aus, also muss ich wissen, ob es einen besseren Weg gibt, dies zu tun.

Irgendwelche Vorschläge?

$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

Ich weiß nicht, ob Sie irgendeine Kontrolle über die Funktionen haben, die die Versprechen zurückgeben. Wenn Sie das tun, würde ich überlegen, sie zu überarbeiten, so dass Sie so viel Async-Kram vermeiden können. Ich denke immer über eine rote Fahne nach, wenn ich mehr als einmal mit Versprechungen nisten muss. –

Antwort

1

Statt dies zu tun,

a().then(function(result) { 
    b(result).then(function(result) { 
     c(result).then(function(result) { 
      console.log("done"); 
     }); 
    }); 
}); 

Sie Kette können alle Versprechungen auf der obersten Ebene.

a() 
    .then(function(result) { 
     return b(result); 
    }) 
    .then(function(result) { 
     return c(result); 
    }) 
    .then(function(result) { 
     console.log("done"); 
    }); 

Das gleiche Muster kann in Ihrem Code verwendet werden.

Um Fehler zu finden, fügen Sie am Ende der Kette .catch hinzu, wenn Sie einen Fehlerhandler für alle Fehler in der Kette wünschen.

a() 
    .then(function(result) { 
     console.log("done"); 
    }) 
    .catch(function(err) { 
     console.error(err); 
    }); 

Für separate Fehlerbehandlungsroutinen bei jedem Schritt, können Sie etwas tun:

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

Jeder Fehler-Handler muss throw so nennen, dass sie die Kette nicht weiter nach unten, wenn ein Fehler passiert.

+0

Vielen Dank @afuous Was ist mit Fehlerreaktion? Wie komme ich damit klar? – vinoli

+0

@vinoli Siehe meine Bearbeitung – afuous

+0

In Ordnung, aber wenn ich separate Fehlermeldung für jede Antwort erhalten möchte? – vinoli