【问题标题】:How to use external variable inside promise response of $http.get [duplicate]如何在 $http.get 的承诺响应中使用外部变量 [重复]
【发布时间】:2014-07-07 11:38:54
【问题描述】:

这是我的代码

for (var i=0; i<5; i++) {
    var url = generate_url(i) ;
    $http.get(url).then(function(response){
        var param2 = response.data.param2
        $scope.outputData.push({'index':i, 'param':param2}) ;
    }) ;
}

在本例中,我假设在$scope.outputData 中获取一个数组,其数据类似于:

[
  {'index':0,param:'a'},
  {'index':1,param:'b'},
  {'index':2,param:'c'},
  {'index':3,param:'d'},
  {'index':4,param:'e'},
]

但我得到的是这样的数据:

[
  {'index':4,param:'a'},
  {'index':4,param:'b'},
  {'index':4,param:'c'},
  {'index':4,param:'d'},
  {'index':4,param:'e'},
]

在这种情况下,我指的外部数据是变量i

请你告诉我麻烦吗?以及如何继续完成我的目标?提前谢谢你,对不起我的英语:)

【问题讨论】:

    标签: javascript angularjs closures


    【解决方案1】:

    这是一个关闭问题,正确的做法是

    for (var i=0; i<5; i++) {
       getData(i);
    }
    var getData=function(index) {
         var url = generate_url(index) ;
        $http.get(url).then(function(response){
            var param2 = response.data.param2
            $scope.outputData.push({'index':index, 'param':param2}) ;
        }) ;
    }
    

    【讨论】:

    • 您的解决方案也适用于我,但结果顺序不正确,但这不是问题。谢谢。
    【解决方案2】:

    您可以在 i 变量上创建一个闭包,以确保它在使用时仍然具有您希望它具有的值。

    for (var i=0; i<5; i++) {
        (function(counter) {
            var url = generate_url(i);
            $http.get(url).then(function(response){
                var param2 = response.data.param2
                $scope.outputData.push({'index':counter, 'param':param2}) ;
            });
        }(i));
    }
    

    但如果结果数组的顺序很重要,您将必须创建一个临时数组,然后按index 对其进行排序。

    如果您不想在所有请求完成之前处理任何请求,您可以使用$q.all

    类似这样的:

    var promises = {};
    for (var i=0; i<5; i++) {
        var url = generate_url(i) ;
        promises[i] = $http.get(url);
    }
    $q.all(promises).then(function(result) {
      for (index in result) {
          var param2 = result[index].data.param2
          $scope.outputData.push({'index':index, 'param':param2}) ;
      }
    });
    

    这也应该保留顺序。

    $q 的文档是 here

    【讨论】:

    • 这是正确的答案
    猜你喜欢
    • 2020-01-10
    • 2018-02-26
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多