2012-05-31 133 views
1

我试图让一些直播流的在线状态和观众人数。我从AJAX获取来自我网站的对象数组。然后我遍历数组并向这些对象添加值。问题是,当我在控制台中记录这些对象的内容时,我发现新创建的密钥,但是当我尝试记录该密钥的值时,它说它是未定义的。jQuery操纵对象内.each()

$.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

你可以发布[jsfiddle](http://jsfiddle.net/)吗? –

+0

http://jsfiddle.net/almirsarajcic/C4Jur/ 对不起,我试图用HTML格式化它,但它没有按照我的预期工作。 –

+2

欢迎来到** async **的精彩世界!你不能那样做。 – SLaks

回答

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) 
     }); 

您运行得到的结果不一致的风险,如果你不采取在处理返回的数据时考虑异步响应。

让我知道这是否有帮助。

+0

谢谢,我认为这是最好的答案。我也在考虑这一点,但我认为加入异步:false,根据jQuery API文档,这不起作用JSONP。现在我不知道如何使用AJAX来做到这一点,因为在添加实时和计数值(我想为这些在AJAX调用中不成功的对象添加live = false和count = 0)之后,我想对这些对象进行排序按数字递减。以下是完整的代码:http://jsfiddle.net/almirsarajcic/C4Jur/1/ –

+0

我并不完全遵循你试图实现的目标,但是听起来你应该在另一个问题上提出问题,只是为了保持它举办...... – Deleteman

+0

像Slaks说的,你告诉我,我不能那样做,所以我在完成事件后添加了我想要的方法。我想我必须在PHP中这样做,因为我对此不满意(我需要按观众数排序这些直播流,但不能,因为我使用了两个直播流提供商)。 谢谢。 –

1

“this”是上下文相关的,您将放入闭包中,将“this”更改为您不期望的内容。考虑cacheing对象在每个顶部...喜欢

var $this = $(this); 
+0

这与闭包无关。 – SLaks

+0

他使用'$ .proxy'来解决这个问题。 – Deleteman