0

我有 YouTube 视频的 URL 列表。我想使用 YouTube API 来查找他们每个人的用户评分和评分计数。API 提供了一种使用 URL 查找此信息的方法,但仅限于单个视频:https ://developers.google.com/youtube/2.0/developers_guide_protocol_video_entries 。

我可以发送一堆同步的 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) {};
};

似乎该功能永远挂起。我的猜测是因为我用太多的请求淹没了服务器。我可以在请求之间设置一个小的延迟,但我认为应该有更好的方法来做到这一点。

获取所有 URL 的评级信息的好方法是什么?

4

1 回答 1

0

我的解决方案最终使用了 setTimeout 和 jQuery Deferred 对象,因此我可以在请求全部完成后执行代码。幸运的是,Stack Overflow 已经有了一个使用单个请求的更简单的解决方案。

我最终这样做了:

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
        }
    });
};
于 2012-05-21T21:34:42.900 回答