2012-04-30 89 views
0

我正在使用YouTube YouTube API來檢索視頻列表的信息。所以我必須使用Request.JSONP類。Mootools - 如何鏈接多個jsonp請求

我的問題是我必須對youtube API進行多次調用,並且無法使其「鏈」。該文檔說,我需要的只是添加選項link:'chain'並使用async:false同步模式(女巫適用於簡單的請求對象)。

這是我已經試過:

var MyClass = new Class({ 
    listVideos: [], 
    videosInfo: [], 
    initialize : function(listVideos){ 
     this.listVideos = listVideos; 
     this.getVideosInfo(); 
    }, 
    getVideosInfo : function(){ 
     var request = new Request.JSONP({ 
      callbackKey: 'callback', 
      link : 'chain', 
      async : false, 
      onComplete: function(data){ 
       this.videosInfo.push(data.entry); 
       console.log(this.videosInfo); 
      }.bind(this) 
     }); 

     this.listVideos.each(function(videoId){ 
      request.options.url = 'http://gdata.youtube.com/feeds/api/videos/' + videoId + '?v=2&alt=json-in-script&format=5'; 
      request.send(); 
     }); 
     console.log("this should be displayed AFTER the requests, not BEFORE u_u"); 
     console.log(this.videosInfo); 
    } 
}); 


var test = new MyClass(['AJso1SJT7Js','hlO5UBxuJlY']) 

這裏的jsfiddle所以你可以用它玩N_N

基本上我要的是所有的請求都完成之後處理videosInfo陣列。

任何想法?

在此先感謝

PS: 我發現了一個「骯髒的解決方案」,以我的問題,http://jsfiddle.net/pleasedontbelong/gLF5h/1/但我不覺得舒服可言,如果請求的一個失敗..它會全部失敗

+0

看看Request.Queue從更多 - 我不指望它適用於Request.JSONP,但您可能能夠將原則應用於您自己的排隊。 –

+0

:O我會試試 – pleasedontbelong

+0

@DimitarChristoff它與JSONP一起工作:) http://jsfiddle.net/pleasedontbelong/vyLq6/3/但是,當使用Request.Queue時,你必須小心,因爲你放棄了類的上下文(this),所以我不得不使用Request.Queue上的「onComplete」事件來將每個響應添加到this.videosInfo屬性:)謝謝!,如果你把你的評論作爲迴應,我會很高興將其標記爲答案。 – pleasedontbelong

回答

1

您可能不應該禁用async,以免在HTTP請求和響應期間凍結UI線程。

Request.JSONP API支持onComplete回調。

通過讓每個onComplete調用後續請求,您可以鏈接請求而不會失去AJAX的異步特性。

+0

yeap我也想到了...我最終使用Request.Queue來管理請求,所以我不必擔心,如果其中一個請求失敗或需要太多時間:) – pleasedontbelong