我正在尝试调用一个函数'submittoServer',这个函数在工厂'pService'中,它进行$ 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;
}
}
答案 0 :(得分:0)
这里的问题是您的服务是承诺返回数据。在解决promise之前,您的函数将保持循环和运行。你需要重构你的循环才能考虑到这一点。
添加.then(fn(){})
以处理解决承诺。收集所有已更改的lineIds并立即提交所有内容并(再次)使用.then(fn(){})
处理已解决的承诺。最后,给你下一组代码逻辑,你可能想要做更多像$ q.all这样的事情来等待所有的诺言解决,然后继续前进(见Wait for all promises to resolve)
实施例
在你的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,您的数据是双向绑定的,只应对其进行更改。
在服务中使用return返回示例$ 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?
});