Mootools - 如何链接多个jsonp请求

时间:2012-04-30 17:03:35

标签: javascript api mootools cross-domain jsonp

我正在使用youtube api来检索视频列表的信息。所以我必须使用Request.JSONP类。

我的问题是我必须多次调用youtube API,而我无法将其设为“链”。该文档说我只需要添加选项link:'chain'并使用async:false在同步模式下执行(在一个简单的Request对象上可以正常工作)。

这就是我尝试过的:

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/但我根本感到不舒服,如果其中一个请求失败了......它将全部失败

1 个答案:

答案 0 :(得分:1)

您可能不应该禁用async,以免在HTTP请求和响应期间冻结UI线程。

Request.JSONP API支持onComplete回调。

您可以通过让每个onComplete调用后续请求来链接请求而不会丢失AJAX的异步性质。