我遇到了一些有点奇怪的行为。我有一个返回长度为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);
});
}
答案 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长度