2016-10-02 2 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 в конце цепочки, если вы хотите, чтобы один обработчик ошибок для всех ошибок в цепочке.

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

Смежные вопросы