我不知道为什么' streamName [i]'在我的getJSON内部返回' undefined'。其中的所有内容都返回正确的值,但只有streamName返回未定义的
var streamName = ['LCK1', 'ryan_clark', 'syndicate', 'riotgames', 'esl_csgo', 'Nightblue3', 'summit1g', 'imaqtpie', 'sodapoppin', 'captainsparklez'];
var nullLogo = "https://dummyimage.com/50x50/ecf0e7/5c5457.jpg&text=0x3F";
var name;
for (var i = 0; i < streamName.length; i++) {
var url = 'https://api.twitch.tv/kraken/streams/' + streamName[i] + '?callback=?';
$.getJSON(url, function(data) {
console.log(name);
if (data.stream == null) {
$('.streamersList').append('<div> <div class="logo"> <img src=' + nullLogo + '></div> <div class="nameStreamer">' + streamName[i] + '</div> <div class="state"> Offline </div></div>');
} else {
$('.streamersList').append('<div> <div class="logo"> <img src=' + data.stream.channel.logo + '></div> <div class="nameStreamer">' + streamName[i] + '</div> <div class="state">' + data.stream.channel.game + ' </div></div>');
}
});
}
&#13;
答案 0 :(得分:1)
因为$.getJSON
是异步函数,所以在回调运行时,i
将完成循环。由于当i
大于或等于streamName
的长度时循环中断,i
将尝试访问数组末尾streamName
中的元素,这是undefined
。
在这种情况下,i
的原因是每个回调实例中的10个是因为在JavaScript中使用作用域的方式。就代码所知,i
与streamName
,nullLogo
和name
一起在函数顶部声明。在遍历循环时,i
的值会发生变化,并且该变化在函数内的任何位置都可见,包括回调内部尚未运行。当它们运行时,i
将为10,因为它到达循环的末尾,这是回调将使用的值。
确保在i
函数中获取$.getJSON
的正确值的一种方法是将i
作为参数传递给立即调用的函数。这将有效地将i
的当前值绑定到参数index
,因此使用index
从数组中获取元素将具有正确的值关于循环的迭代。
for (var i = 0; i < streamName.length; i++) {
// note how i can be used here because this is synchronous, aka happening right now
var url = 'https://api.twitch.tv/kraken/streams/' + streamName[i] + '?callback=?';
(function(index) {
$.getJSON(url, function(data) {
// this is asynchronous (happens in the future), so i will have a different
// value by the time it is called, but index will have the correct value
console.log(name);
if (data.stream == null) {
$('.streamersList').append('<div> <div class="logo"> <img src='
+ nullLogo
+ '></div> <div class="nameStreamer">'
+ streamName[index]
+ '</div> <div class="state"> Offline </div></div>');
} else {
$('.streamersList').append('<div> <div class="logo"> <img src='
+ data.stream.channel.logo
+ '></div> <div class="nameStreamer">'
+ streamName[index]
+ '</div> <div class="state">'
+ data.stream.channel.game
+ ' </div></div>');
}
});
})(i);
}
答案 1 :(得分:0)
$.getJSON
是一个异步函数。因此,当函数回调发生时,循环已经循环遍历i的所有迭代。所以我在你的情况下的价值是streamName.lenghth
这使得streamName[i]
未定义
我会避免在这样的回调中使用索引。您需要使用的是立即调用的函数express(IIFE)Checkout这个其他stackoverflow帖子。 How to access index variable in a jquery getJson call ($.getJson) during a loop?