我正在尝试获取某些直播视频的在线状态和观看者数量。我正在通过AJAX从我的网站获取一系列对象。然后我迭代数组并向这些对象添加值。问题是,当我在控制台中记录这些对象的内容时,我发现了新创建的密钥,但是当我尝试记录该密钥的值时,它表示它未定义。
$.each(livestreams, function () {
if(this.provider === 'TwitchTV') {
$.ajax({
url: 'http://api.justin.tv/api/stream/list.json?channel=' + this.channel.toLowerCase(),
dataType: 'jsonp',
jsonp: 'jsonp',
success: $.proxy(function (stream) {
this.live = true;
this.count = stream[0].channel_count;
}, this)
});
} else {
$.ajax({
url: 'http://api.own3d.tv/liveCheck.php?live_id=' + this.channel,
dataType: 'xml',
success: $.proxy(function (stream) {
this.live = stream.find('isLive').text();
this.count = stream.find('liveViewers').text();
}, this)
});
}
console.log(this);
/* returns
channel: "garenatw"
count: 8237
id: "3"
live: true
name: "garena"
provider: "TwitchTV"
username: "grifon"
__proto__: Object
(of course, only for this specific object)
*/
console.log(this.live); // returns undefined
});
答案 0 :(得分:2)
您可以在设置值之前登录这些值。由于你正在处理ajax请求,所以你不应该线性思考。
您不应在功能结束时登录您的值,而应在成功函数结束时记录它们:
$.each(livestreams, function () {
if(this.provider === 'TwitchTV') {
$.ajax({
url: 'http://api.justin.tv/api/stream/list.json?channel=' + this.channel.toLowerCase(),
dataType: 'jsonp',
jsonp: 'jsonp',
success: $.proxy(function (stream) {
this.live = true;
this.count = stream[0].channel_count;
console.log(this); //HERE
}, this)
});
如果在处理返回的数据时未考虑异步响应,则存在获得不一致结果的风险。
让我知道这是否有帮助。
答案 1 :(得分:1)
“这个”是上下文的,你会陷入关闭状态,将“这个”改为你不期望的东西。考虑在每个顶部缓存对象......比如
var $this = $(this);