如何在AngularJS中通过链接http调用来构建对象数组

How to build an object array by chaining http calls in AngularJS?

本文关键字:调用 http 构建 数组 对象 链接 AngularJS      更新时间:2023-09-26

我想构建一个对象数组,但对于每个对象,我需要多个链式http调用。例如:

var objects = [];
$http.get(/getDataUrl)
.then(function(data){
   for(i = 0; i < data.length; i++)
   {
       objects[i] = { value1 : data.value }
   }
   for(i = 0; i < objects.length; i++)
   {
       http.get(objects[i].value1)
       .then(function(data){
           objects[i].value2 = data.value;
       }
   }
})

有什么想法可以妥善处理这场混乱吗?

您将始终获得'i'值作为最终索引,因为当ajax请求给出200时,渲染器将打印它,这将需要一些时间。在短时间内,for循环将被执行,因此您将始终获得"i"值的最后一个索引

为了解决这个问题,你将不得不使用,封闭内循环

修改你的代码如下,

var objects = [];
$http.get(/getDataUrl)
.success(function(data){
   for(i = 0; i < data.length; i++)
   {
       objects[i] = { value1 : data.value }
   }
   for(i = 0; i < objects.length; i++)
   {
       (function(index) {
           var currentURL = objects[i].value1;
           $http.get(currentURL)
           .success(function(data) {
               // both currentURL and i value can be accessed here 
               console.log(currentURL);
               console.log(index); // i value  = index
               objects[index].value2 = data.value;
           });
       })(i);
   }
})

现在您可以访问匿名函数中的索引。希望这能帮助

您可以尝试使用success而不是success,因为$http不是标准承诺:

var objects = [];
$http.get('/getDataUrl')
.success(function(data){
   for(i = 0; i < data.length; i++)
   {
       objects[i] = { value1 : data.value }
   }
   for(i = 0; i < objects.length; i++)
   {
       http.get(objects[i].value1)
       .success(function(data2){
           objects[i].value2 = data2.value;
       }
   }
})

试试这样的方法:只有一个循环来规则它们;)

$http.get(/getDataUrl)
.then(function(data){
   for(i = 0; i < data.length; i++)
   {
       objects[i] = { value1 : data.value }

       $http.get(objects[i].value1)
       .then(function(data){
           objects[i].value2 = data.value;
       }
    }
})