getJSON变量返回undefined

时间:2016-07-22 14:55:58

标签: javascript jquery

我不知道为什么' 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;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

因为$.getJSON是异步函数,所以在回调运行时,i将完成循环。由于当i大于或等于streamName的长度时循环中断,i将尝试访问数组末尾streamName中的元素,这是undefined

在这种情况下,i的原因是每个回调实例中的10个是因为在JavaScript中使用作用域的方式。就代码所知,istreamNamenullLogoname一起在函数顶部声明。在遍历循环时,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?