数组在Chrome控制台上有长度,但在调用.length时却没有

时间:2017-06-10 17:01:07

标签: javascript arrays google-chrome

我遇到了一些有点奇怪的行为。我有一个返回长度为0的对象数组。但是,如果我在控制台中记录数组,则length方法显示长度为8.

任何人都知道发生了什么?另外我如何获得代码的长度? Here's a link to an image of the console

这是我的代码:

   function createObjArrStreamers () {
    for(var i = 0; i < users.length; i++) {
        connectToApi(i); 
    }
}

function passApiDataToStreamersArr (data, i) {
    if (data.stream !== null) {
         streamersObjArr.push({
               name: users[i],
               streaming_status: data.stream.stream_type,
               game: data.stream.game,
               twitchID: data.stream._id,
               linkToStream: data.stream.channel.url
         });
      } else {
      streamersObjArr.push({
          name: users[i],
          streaming_status: "Offline"
        });
    }
}


function connectToApi ( i ) {
var  targetUrl = url + users[i] + "?" + "callback=?";
  $.getJSON(targetUrl, function (userData){
      passApiDataToStreamersArr(userData, i);
  });
}

3 个答案:

答案 0 :(得分:2)

您有多个 异步 请求,并且无法知道它们何时完成。

您可以创建一个promises数组,并使用$.when解析整个promise数组何时已解析...意味着在所有请求成功完成后:

function createObjArrStreamers() {

  var promises = users.map(function(user, i) {
    // connectToApi function returns request promise, add it to array
    return connectToApi(i);
  });

  $.when.apply(null, promises).then(function() {
    // full array should now be populated
    console.log('Arr length: ', streamersObjArr.length)
  });   

}

function passApiDataToStreamersArr(data, i) {
  //...... No changes
}


function connectToApi(i) {
  var targetUrl = url + users[i] + "?" + "callback=?";
  // return promise
  return $.getJSON(targetUrl, function(userData) {
    passApiDataToStreamersArr(userData, i);
  });
}

答案 1 :(得分:0)

我猜测是因为我无法看到您正在记录的变量,但我认为您正在做的是在存储变量中引用数组的初始长度。请看下面的假设:

let arr = []
let b = arr.length
arr.push('d')
console.log(arr.length, b)
// arr.length will be 1 and b will be 0.

答案 2 :(得分:0)

扩展时,控制台会显示更新的信息。

在展开之前,它会显示一个空数组“[]”。

因此,当您打印console.log(数组)时,它实际上具有长度0.但是,稍后,您以某种方式向其添加一些数据,因此您可以看到所有这些数据。

即:

var a = [];
console.log(a, a.length); // will print [], 0
a.push('a');

当您检查控制台时,您会看到[],当您展开对象时,您将看到它具有元素0:'a',您还将看到0长度