2012-05-19 129 views
0

我有一個YouTube視頻網址列表。我想使用YouTube API來查找每個用戶的評分和評分。該API提供了一種使用URL查找此信息的方法,但僅適用於單個視頻:https://developers.google.com/youtube/2.0/developers_guide_protocol_video_entriesYouTube API - 從網址列表獲取視頻評分

我可以發送一堆同步AJAX請求,但速度太慢。我嘗試異步發送它們,並等待它們完成,如下所示:

MyObj.prototype.getYTData = function (urls) { 

    var self = this, 
     requests = 0, 
     vids = []; 

    $.each(urls, function (i, vidUrl) { 

     var id = self.getURLParameter(vidUrl, 'v'); 
     requests += 1; 
     $.ajax({ 
      type: 'GET', 
      url: 'https://gdata.youtube.com/feeds/api/videos/' + id + '?v=2', 
      data: { alt: 'jsonc' }, 
      success: function (data) { 

       self.isGood(data.data) && vids.push(data.data); 
      }, 
      complete: function() { 
       requests -= 1; 
      } 
     }); 
    }); 

    while (requests) {}; 
}; 

它看起來像該函數永遠掛起。我的猜測是這是因爲我用太多請求淹沒服務器。我可以在請求之間設置一個小的延遲,但我認爲應該有更好的方法來做到這一點。

什麼是獲得所有網址評分信息的好方法?

回答

0

我的解決方案最終使用setTimeout和jQuery Deferred對象,以便在請求全部完成後執行代碼。幸運的是,堆棧溢出已經有一個使用單個請求的much simpler solution

我落得這樣做:

MyObj.prototype.getYTData = function (vidIDs) { 

    var IDGroup = $.map(vidIDs, function (id) { 
      if (id.indexOf('-') == -1) { 
       return id; 
      } 
      return '"' + id + '"'; 
     }).join('|'); 

    $.ajax({ 
     type: 'GET', 
     url: 'https://gdata.youtube.com/feeds/api/videos?v=2&q=' + IDGroup, 
     data: { alt: 'jsonc' }, 
     success: function (data) { 

      // Process data 
     } 
    }); 
};