2012-05-31 134 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