Jquery $.getJSON,$.each和变量范围

Jquery $.getJSON,$.each和变量范围,jquery,ajax,scope,each,getjson,Jquery,Ajax,Scope,Each,Getjson,我一整天都在浏览论坛,但我没弄明白 我正在调用Justin.TV-API来显示我的“跟踪”流列表,然后执行嵌套调用来检查其中哪一个是在线的 以下是我想要使用的代码: //Get Favorites as Object "favs" var viewers; $.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?', function(favs) {

我一整天都在浏览论坛,但我没弄明白

我正在调用Justin.TV-API来显示我的“跟踪”流列表,然后执行嵌套调用来检查其中哪一个是在线的

以下是我想要使用的代码:

//Get Favorites as Object "favs"
        var viewers;
        $.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?', function(favs) {
            $.each(favs, function(key, value) {
                //For every Object, check if user is referenced in stream and therefore online
                $.getJSON('http://api.justin.tv/api/stream/list.json?channel=' + favs[key].login + '&jsonp=?', function(streams) {
                    viewers = streams[0].channel_count;
                });
                $('#result').append(favs[key].title + ' ' + key + ': ' + favs[key].login + ' (' + viewers + ') Viewers<br />');
            });
        });
//Get Favorites as Object "favs"
        var viewers;
        $.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?', function(favs) {
            for (var key in favs) {
                //For every Object, check if user is referenced in stream and therefore online
                $.getJSON('http://api.justin.tv/api/stream/list.json?channel=' + favs[key].login + '&jsonp=?', function(streams) {
                    viewers = streams[0].channel_count;
                });
                $('#result').append(favs[key].title + ' ' + key + ': ' + favs[key].login + ' (' + viewers + ') Viewers<br />');
            }
        });
var favs;
        var streams;
        var viewers;
        $.ajax({
            url: 'http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?',
            async: false,
            dataType: 'json',
            success: function(favs) {
                for (var key in favs) {
                    $.ajax({
                        url: 'http://api.justin.tv/api/stream/list.json?channel=' + favs[key].login + '&jsonp=?',
                        async: false,
                        dataType: 'json',
                        success: function(streams) {
                            viewers = streams[0].channel_count;
                        }
                    });
                    $('#result').append(favs[key].title + ': ' + favs[key].login + ' (' + viewers + ') Viewers<br />');
                }
            }
        });
Day[9]: day9tv (undefined) Viewers
FollowGrubby: followgrubby (undefined) Viewers
OneMoreGame.TV: onemoregametv (undefined) Viewers
我已经用附录和警报做了几次检查——JSON响应是有效的

谁能帮我


非常感谢您的时间。

Ajax是异步的,任何在填充查看器变量后需要访问该变量的内容都需要位于Ajax请求的完整回调中

延迟对象将是这里的方式,我将制作一个小演示

更新:

不需要延迟对象,只需要重新构造一点

//Get Favorites as Object "favs"
$.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?', function(favs) {
    $.each(favs, function(key, value) {
        //For every Object, check if user is referenced in stream and therefore online
        $.getJSON('http://api.justin.tv/api/stream/list.json?channel=' + favs[key].login + '&jsonp=?', function(streams) {
            $('#result').append(value.title + ' ' + key + ': ' + value.login + ' (' + streams[0].channel_count + ') Viewers<br />');
        });
    });
});
//将收藏夹作为对象“favs”获取
$.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?,功能(favs){
$。每个(FAV、功能(键、值){
//对于每个对象,检查用户是否在流中被引用,从而在线
$.getJSON('http://api.justin.tv/api/stream/list.json?channel=“+favs[key]。登录+”&jsonp=?”,函数(流){
$(“#结果”).append(value.title+''+key+':'+value.login+'('+streams[0].channel_count+')查看器
); }); }); });
​更新:
另一种方法是:

var favorites = [];
function processFavorites () {
    $("#result").empty();
    $.each(favorites,function(index,obj){
        // here we populate the results div
        $('#result').append(obj.title + ' ' + index + ': ' + obj.login + ' (' + obj.viewers + ') Viewers<br />');
    });
}
function getFavorites () {
    favorites = [];
    $.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?', function(favs) {
        var defArr = [];
        $.each(favs, function(key, value) {
            //For every Object, check if user is referenced in stream and therefore online
            defArr.push($.getJSON('http://api.justin.tv/api/stream/list.json?channel=' + favs[key].login + '&jsonp=?', function(streams) {
                favorites.push({title:value.title,key:key,login:value.login,viewers:streams[0].channel_count});
            }));
        });
        $.when.apply($,defArr).always(function(){
            processFavorites();
        });
    });
}
// this runs the process of getting and processing favorites. Run it when you want.
getFavorites();​
var收藏夹=[];
函数processFavorites(){
$(“#结果”).empty();
$.each(收藏夹、函数(索引、obj){
//这里我们填充results div
$(“#结果”).append(obj.title+''+index+':'+obj.login+'('+obj.viewers+')viewers
); }); } 函数getFavorites(){ 收藏夹=[]; $.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?,功能(favs){ var defArr=[]; $。每个(FAV、功能(键、值){ //对于每个对象,检查用户是否在流中被引用,从而在线 defArr.push($.getJSON('http://api.justin.tv/api/stream/list.json?channel=“+favs[key]。登录+”&jsonp=?”,函数(流){ 收藏夹.push({title:value.title,key:key,login:value.login,viewers:streams[0].channel\u count}); })); }); $.when.apply($,defArr).always(函数(){ processFavorites(); }); }); } //这将运行获取和处理收藏夹的过程。你想什么时候运行它。 getFavorites();​
但是,提要目前没有返回任何结果,我认为这与此代码无关


OP注意:附加顺序可能无法预测。所有第二个getJSON调用都将一个接一个地被触发,响应可能不会以发送的顺序到达。非常感谢,这非常有效。我仍然会尝试进入延迟对象,因为我感兴趣的是将一些数据存储在变量中以供以后处理。也就是说,我可以按照特定的顺序显示它们。好的,我必须回到这里。当我试图每隔几秒钟自动更新列表并想做一些其他事情时,我认为我真的应该将列表保存为全局变量。如何实现这一点?您需要全局变量做什么?如果需要再次更新列表,则需要再次发出ajax请求。只要将这段代码移动到一个函数中,并在需要更新时运行所述函数。如果我想对列表排序或捕获喜欢但离线的流,该怎么办?我只是觉得把它保存为变量更方便。最好是一个数组。我将试验jQuery.when()和jxhr.push()——这是正确的方法吗?
var favorites = [];
function processFavorites () {
    $("#result").empty();
    $.each(favorites,function(index,obj){
        // here we populate the results div
        $('#result').append(obj.title + ' ' + index + ': ' + obj.login + ' (' + obj.viewers + ') Viewers<br />');
    });
}
function getFavorites () {
    favorites = [];
    $.getJSON('http://api.justin.tv/api/user/favorites/hubschrauber.json?jsonp=?', function(favs) {
        var defArr = [];
        $.each(favs, function(key, value) {
            //For every Object, check if user is referenced in stream and therefore online
            defArr.push($.getJSON('http://api.justin.tv/api/stream/list.json?channel=' + favs[key].login + '&jsonp=?', function(streams) {
                favorites.push({title:value.title,key:key,login:value.login,viewers:streams[0].channel_count});
            }));
        });
        $.when.apply($,defArr).always(function(){
            processFavorites();
        });
    });
}
// this runs the process of getting and processing favorites. Run it when you want.
getFavorites();​