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