Jquery $.getJSON,$.each和变量范围
我一整天都在浏览论坛,但我没弄明白 我正在调用Justin.TV-API来显示我的“跟踪”流列表,然后执行嵌套调用来检查其中哪一个是在线的 以下是我想要使用的代码: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) {
//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();