2016-10-02 5 views
0

네 가지 응답의 약속을 가져야하지만이 작업을 수행하려면 먼저 모든 함수를 처음부터 끝까지 순서대로 호출해야합니다. 내 코드에서 마지막 호출 된 함수의 약속 콜백에서 다음 함수를 호출한다는 것을 알 수 있습니다.순차적 약속

코드가 적절하지 않으므로이를 수행하는 데 더 좋은 방법이 있는지 알아야합니다.

제안 사항? 대신이 일을

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

동일한 패턴을 코드에 사용할 수 있습니다.

오류를 catch하려면 체인의 모든 오류에 대해 하나의 오류 처리기를 원할 경우 .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