我在JavaScript closures
和AngularJS promises
方面没有太多经验。所以,这是我的方案
目标:
我需要在$http
循环中进行for
次请求调用
(明显)问题
即使循环完成,我的变量仍未更新
当前实施
function getColumns(fieldParameters)
{
return $http.get("api/fields", { params: fieldParameters });
}
for(var i = 0; i < $scope.model.Fields.length; i++)
{
var current = $scope.model.Fields[i];
(function(current){
fieldParameters.uid = $scope.model.Uid;
fieldParameters.type = "Columns";
fieldParameters.tableId = current.Value.Uid;
var promise = getColumns(fieldParameters);
promise.then(function(response){
current.Value.Columns = response.data;
}, error);
})(current);
}
//at this point current.Value.Columns should be filled with the response. However
//it's still empty
我能做些什么来实现这个目标?
由于
答案 0 :(得分:1)
var promises = [];
for(var i = 0; i < $scope.model.Fields.length; i++)
{
var current = $scope.model.Fields[i];
promises.push(function(current){
//blahblah
return promise
});
}
$q.all(promises).then(function(){
/// everything has finished all variables updated
});
答案 1 :(得分:1)
如果我正确理解了您的问题,那么您需要完成一些工作所需的字段列表。然后,当完成所有异步工作时,您希望继续。所以使用$ q.all()应该可以解决问题。当所有递交给它的承诺清单解决时,它将解决。所以它基本上就像“等到所有这些东西完成,然后做到这一点”
您可以尝试这样的事情:
var promises = [];
for(var i=0; i< $scope.model.Fields.length; i++) {
var current = $scope.model.Fields[i];
promises.push(getColumns(fieldParameters).then(function(response) {
current.Value.Columns = response.data;
}));
}
return $q.all(promises).then(function() {
// This is when all of your promises are completed.
// So check your $scope.model.Fields here.
});
编辑:
尝试此操作,因为您没有看到正确的项目更新。更新你的getColumns方法以接受该字段,在getColumns调用中发送字段:
function getColumns(fieldParameters, field)
{
return $http.get("api/fields", { params: fieldParameters}).then(function(response) {
field.Value.Columns = response.data;
});
}
...
promises.push(getColumns(fieldParameters, $scope.model.Fields[i])...