Angular $ http:异步调用我收到了回复吗?

时间:2014-04-22 05:30:26

标签: angularjs asynchronous

我去服务器并获得一个JSON阵列污染一对纬度/长对的阵列&一些其他信息(例如车辆描述,时间戳)。对于每一个,我想使用谷歌地图来反转地理编码&获取街道地址,然后将数据放入ng-grid。

我的ng-Grid绑定到$scope.myGrid,直到现在,没有反向地理编码,我只是循环JSON数据和$scope.myGrid.push('{When: data[i].time_stamp, Vehicle: data[i].description'}

工作正常,现在我想添加反向地理编码,AFAIK意味着使用$http.get

由于这是异步的,我最初使用“[address not available]”填充网格的“地址”列。

当我收到回复时,我想从结果中设置$scope.myGrid[???].address

但是,我怎么知道索引???是什么?如果我有3个未完成的异步请求并得到响应,我怎么知道它对应哪个网格行?

我的$http.get位于for(var i = 0; i < data.length; i++)循环的中间位置。我可以以某种方式将i传递给$http.get功能吗?或者我该怎么办?

抱歉,我只是在学习。

2 个答案:

答案 0 :(得分:1)

我认为$http不需要了解i,但then成功回调确实如此。以下内容应该会有所帮助。

angular.forEach(data, function(datum, i) {
  $http.get(...).then(function(response) {
    // Here you have the response and i available
  });
});

注意:我故意使用angular.forEach而不是for循环。由于ifor变量的性质,如果您在for循环中定义了异步回调,i实际上将始终等于其最终值,{ {1}}每次回调。使用data.length - 1可以避免此问题。

答案 1 :(得分:1)

如果要使用“for”,则需要使用Anonymous函数来执行此操作。将我传递给匿名函数。

for(var i = 0; i < $scope.myGrid.length; i++){
  (function(i){
    $http.get(...).success(function(data){
      $scope.myGrid[i].address = data
    });
  })(i);
}

恕我直言,“forEach”在你的情况下可能更好

$scope.myGrid.forEach(function(item, i){
  //item equels $scope.myGrid[i]
  $http.get(...).success(function(data){
    item.address = data
  });
});