在AngularJS中使用闭包和承诺
问题描述:
我对JavaScript closures
和AngularJS promises
没有太多的经验。所以,这里是我的方案在AngularJS中使用闭包和承诺
目标:
我需要$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
我该怎么做才能做到这一点?
感谢
答
如果我理解你的问题正确的,你有你需要做一些工作领域的列表。然后当所有这些异步工作完成后,你想继续。所以使用$ 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])...
答
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
它可以工作,但是数据没有被更新到正确的'当前'对象。这就是为什么我认为我需要在这里关闭。但是,我仍然会赞成你的部分答案。谢谢 –
它可以工作,但是数据没有被更新到正确的'当前'对象。这就是为什么我认为我需要在这里关闭。无论如何,我会反过来为你提供部分答案。 –
@LuisLavieri查看我上面的修改。我认为应该这样做。 – peterholcomb
谢谢。那非常接近。我不得不传递'i'并在'$ http'中填充'fieldParameter'对象,以使其在最后工作 –