循环等待直到所有promises在下一次迭代之前解析

时间:2017-05-31 23:41:12

标签: javascript angularjs promise angular-promise

这是我对AngularJS的要求:

 for (var i = 0, len = self.Scope.data.length; i < len; i++) 
{

         var data = self.Scope.data[i];
         var self = this;
//First asynchronous function
self.EcritureService.createNewData(data).then(() => {
         })                                                     
//Second asynchronous function
self.OperationService.getOperation(data.idOperation).then((operation) => {

         })   
//Third asynchronous function
self.AccountService.getAccount(data.codeCompte).then((compte) => {
               currentAccount = compte;
               currentAccount.montant = currentAccount.montant+data.montant;
         })   
//Fourth one relies on the third result, So it must be executed sequentially
self.AccountService.updateAccount(currentAccount).then(() => {
         })                    
}
// After all fetch loop's promises are resolved I want to execute some instructions here for to update the operation retrieved in the second function.

我希望这个循环迭代器等到所有的promise都被解析后才能进行下一步,而不是确保完成所有的工作,转移到循环bloc之外的最后一个功能

2 个答案:

答案 0 :(得分:0)

创建承诺数组并使用:- discontiguous(p/0). p :- q. q. p. 在所有承诺得到解决时运行

:- include("test1.pro").

答案 1 :(得分:0)

首先,我会说你可能不希望这些服务成为承诺,因为你正试图绕过&#34;承诺&#34;他们因此,最简单的解决方案是将服务重写为正常返回而不是通过承诺。

但要回答你的问题。第二部分第一部分 - 将第四个承诺链接到第三个承诺的最简单方法就是把它放在第三个承诺里面。然后,就像这样:

//Third asynchronous function 
self.AccountService.getAccount(data.codeCompte).then((compte) => {
           currentAccount = compte;
           currentAccount.montant = currentAccount.montant+data.montant; 
           //Fourth one relies on the third result, So it must be executed sequentially
           self.AccountService.updateAccount(currentAccount).then(() => {
     })  
 })

如果你进行了任何错误处理,你可能会决定将嵌套的promise放在.finally子句中。

至于让循环等待,for循环真的不是为了做到这一点而设计的。实现这一目标的最简单方法是编写自己的循环并使用$ q.all将承诺组合在一起。你需要跟踪一个循环计数器,你在$ q.all的.then中递增,并使用一个递归函数,该函数在完成所需的循环数时就会爆发。