2016-08-05 156 views
1

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

我该怎么做才能做到这一点?

感谢

回答

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])... 
+1

它可以工作,但是数据没有被更新到正确的'当前'对象。这就是为什么我认为我需要在这里关闭。无论如何,我会反过来为你提供部分答案。 –

+0

@LuisLavieri查看我上面的修改。我认为应该这样做。 – peterholcomb

+1

谢谢。那非常接近。我不得不传递'i'并在'$ http'中填充'fieldParameter'对象,以使其在最后工作 –

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

它可以工作,但是数据没有被更新到正确的'当前'对象。这就是为什么我认为我需要在这里关闭。但是,我仍然会赞成你的部分答案。谢谢 –