Javascript-索引对象数组的奇怪行为

Javascript-索引对象数组的奇怪行为,javascript,arrays,Javascript,Arrays,因此,我有一个难题,涉及以下代码: $scope.getUserContact = function(data) { var i; for (i = 0; i < data.length; i += 1) { $http({ method: 'GET', url: [Removed] }).then(function successCallback(response) {

因此,我有一个难题,涉及以下代码:

$scope.getUserContact = function(data) {
    var i;
    for (i = 0; i < data.length; i += 1) {
        $http({
            method: 'GET',
            url: [Removed]
        }).then(function successCallback(response) {
            alert(JSON.stringify(data));
            alert(data.length);
            alert(JSON.stringify(data[i]));
            ...
        }, function errorCallback(response) {
        });
    }
}
基本上,它吐出一个由一个对象组成的数组

第二行吐出来

1

正如预期的那样,数组的长度为1

第三条线吐出来

未定义

我只是不明白索引数组如何突然导致
未定义
,而不是在索引处给我对象

值得注意的是,
数据
是函数的一个参数


有什么帮助吗?我认为这要么是我的愚蠢错误,要么是JavaScript深处的一些奇怪和未知行为。

问题在于
$http
请求是异步的,所以

  • 首先,循环将初始化所有请求
  • 然后,当i=data.length时,请求将结束,每个回调都将使用最后一个值i调用,而不是您想要的值
您应该这样做,以避免在回调中使用相同的
i

$scope.getUserContact=函数(数据){
var i;
对于(i=0;i}
我们需要看看
数据是什么。@ScottMarcus更新了,尽管我只列出了一个字段。其余的都是字符串和数字。请参见
i
alert(data.length)之后的值@Mahi非常感谢你。我是1而不是0。原因是否是使用新值i运行的回调?如果是这样,什么是确保回调中使用的索引是正确索引的最有效方法?@AndrewFan我不知道为什么会发生这种情况。我需要在收到所有请求的结果后设置数据,那么如何在完成对doRequest的所有调用后运行另一个回调?实际上,这很好-我可以在每次迭代后更新数据。谢谢。要等待通话,您可以返回$http正在使用的承诺(只是一个简单的返回),要等待您可以使用的每个通话,
$q.all
我刚刚编辑了添加链接和使用$http承诺的示例
[ 
    {
        "listingId":"String",
        ...other Strings and ints ...
    }
]