在AngularJS中使用带有promise的闭包

时间:2016-08-05 15:14:53

标签: javascript angularjs closures angular-promise

我在JavaScript closuresAngularJS 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

我能做些什么来实现这个目标?

由于

2 个答案:

答案 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])...