>我正在使用youtube api来检索视频列表的信息。所以我必须使用 Request.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
数组。
有什么想法吗?
提前致谢
附注:我找到了我的问题的"肮脏解决方案",http://jsfiddle.net/pleasedontbelong/gLF5h/1/但如果其中一个请求失败,我对此感到一点也不舒服。一切都会失败
您可能不应该禁用async
,以免在HTTP请求和响应期间冻结UI线程。
Request.JSONP API 支持onComplete
回调。
您可以通过让每个onComplete
调用后续请求来链接请求而不会丢失 AJAX 的异步性质。