循环angularJs的内部异步调用

循环angularJs的内部异步调用,angularjs,angularjs-service,angular-http,Angularjs,Angularjs Service,Angular Http,我试图调用工厂“pService”中的函数“submittoServer”,该函数进行$http调用,然后广播数据。对“submittoserver”的调用发生在for循环中。这里的问题是,直到最后一个循环(只发送最后一项)之前,我无法看到正在进行的实际调用,但正如您在下面的代码中看到的,我希望在每次调用后更新一个特定的变量,请有人建议我如何不这样做。我不能在这里调用,因为我有其他方法,用不同的输入调用相同的工厂函数 for (var i = vr.lines.length - 1; i >

我试图调用工厂“pService”中的函数“submittoServer”,该函数进行$http调用,然后广播数据。对“submittoserver”的调用发生在for循环中。这里的问题是,直到最后一个循环(只发送最后一项)之前,我无法看到正在进行的实际调用,但正如您在下面的代码中看到的,我希望在每次调用后更新一个特定的变量,请有人建议我如何不这样做。我不能在这里调用,因为我有其他方法,用不同的输入调用相同的工厂函数

for (var i = vr.lines.length - 1; i >= 0; i--) {

                    if (parseInt(vr.lines[i].id) === id && Boolean(vr.lines[i].IsVoided) != true) {
                        lineId = vr.lines[i].lineID;

                        pService.submitToServer(actionId, { "IData": id }, ineId)
                                linesRemoved = linesRemoved + 1;

                    }

                    if (linesRemoved === lineqty)
                    {
                        updateModel = true;
                    }
                }

这里的问题是,您的服务承诺返回数据。在承诺得到解决之前,您的函数将继续循环运行。你需要重构你的循环来考虑这一点

添加一个
。然后(fn(){})
来处理解析承诺。收集所有更改的LineID并一次性提交,然后(再次)使用
处理已解决的承诺。然后(fn(){})
。最后,考虑到下一组代码逻辑,您可能希望执行类似$q.all的操作,以等待所有承诺解决后再继续(请参阅)

范例

在for循环之前:

var self=this;
self.linesRemoved = 0; // or init as needed.
在for循环中

pService.submitToServer(actionId,{data}).then(function(resp){
   self.linesRemoved++;  // shortcut, this does +1 to itself.
});
为什么要更新模型?使用Angular,您的数据是双向绑定的,应该只对其更改作出反应

服务中返回的$http调用示例,这本身就是一个承诺:

 return $http.post(url, data, { cache: true });
在像这样的控制器中使用此选项

service.callHttp(data).success(function(resp){
      self.linesRemoved++;
 }).error(function(resp){});
如果你不得不等待,那么最好是把所有的东西都拿着,等到它们全部完成

var promises =[];
for(){
   promises.push(service.callHttp());
}
$q.all(promises).then(function(){  
     // do work if(self.linesRemoved==lineQty) 
     // update...  You can't evaluate until they are all finished right?
});

您好,KnowHowSolutions-thx对于响应,我已经尝试了这个方法,但这个方法不起作用,因为我没有从$http调用返回承诺,一旦$http调用成功,我将调用另一个方法来广播结果。为什么$http是一种承诺。把它还给我。不幸的是,这也帮不了我。我甚至尝试过$q,它的行为也很相似。