首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环遍历角HTTP请求中的对象,直到响应才运行下一个循环

循环遍历角HTTP请求中的对象,直到响应才运行下一个循环
EN

Stack Overflow用户
提问于 2016-03-15 12:27:25
回答 1查看 2.4K关注 0票数 0

我有这样的代码:

代码语言:javascript
运行
复制
// HTTP request
$http.get(dataSource).
then(function(data, status, headers, config) {
    // Products array
    var products = [];

    // Loop through each array value
    for (var slug in data.data){

        var product = data.data[slug];
        $http.get('content/products/' + product + '.json').then(function(response){

            products.push(response.data);
            $scope.products = products;

        }).catch(function(){

            console.log('there was an error');

        });

    }

}).catch(function(){
    console.log('there was an error');
});

问题是,有时产品范围数组项并不总是按照请求的顺序到达。

我需要产品$scope循环遍历数组,并且只有当响应被推送到数组时:

代码语言:javascript
运行
复制
products.push(response.data);

它最终被分配给变量$scope.products

修改我当前的HTTP请求有帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-15 12:34:46

问题存在于包含异步代码的for循环中,即同步的。在实践中,无法保证内部http.get以相同的顺序处理数据。

试试这个:

代码语言:javascript
运行
复制
// HTTP request
$http.get(dataSource).
  then(function(data, status, headers, config) {
    // Products array
    var products = [];

    // Loop through each array value
    var promises = [];
    for (var slug in data.data){

      var product = data.data[slug];
      promises.push($http.get('content/products/' + product + '.json'));
    }

    $q.all(promises).then(function(response){

      for (var i=0,len = response.length;i<len;++i){

        products.push(response[i].data);

      }
      $scope.products = products;

    }).catch(function(){

        console.log('there was an error');

    });

  }).catch(function(){

    console.log('there was an error');

  });

我建议使用$q.all()来保持http.get结果的顺序。还请注意,$scope.products是在for循环之后,该循环按照您指定的方式将数据值分配给products数组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36011373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档