为每个youtube视频ID单独获取请求

separate get requests for each youtube video ID

本文关键字:单独 获取 请求 ID 视频 youtube      更新时间:2023-09-26

我试图通过每个id从数组持有youtube id到get请求。目标是获取每个视频id的名称并创建一个新数组。

首先,这就是我正在做的。我得到一个空数组

var x = ['CSvFpBOe8eY', 'Zi_XLOBDo_Y'];
var x_title = [];
for (var i = 0; i < x.length; i++) {
    $.getJSON('http://gdata.youtube.com/feeds/api/videos/' + x[i] + '?v=2&alt=jsonc', function (data, status, xhr) {
        x_title[i]= data.data.title;
    });    
}
console.log(x_title)

小提琴来了

http://jsfiddle.net/sghoush1/Cnepk/5/

数组是空的,因为它在所有getJSON调用完成之前被打印出来。但是,你还有另一个问题。

i没有为每个循环限定作用域,因此您最终将使用请求完成时i的最后一个值。

你需要用IIFE(立即调用的函数执行)包装内部循环,并将i传递给它,或者使用数组的forEach api。

IIFE使用示例http://jsfiddle.net/jj7Pg/

for (var i = 0; i < x.length; i++) {
    (function(_i){
        $.getJSON('http://gdata.youtube.com/feeds/api/videos/' + x[_i] + '?v=2&alt=jsonc', function (data, status, xhr) {
            x_title[_i]= data.data.title;
            console.log(x_title);
        }); 
   }(i));
}

forEach示例http://jsfiddle.net/jj7Pg/1/

x.forEach(function(item, indx){
    $.getJSON('http://gdata.youtube.com/feeds/api/videos/' + item + '?v=2&alt=jsonc', function (data, status, xhr) {
        x_title[indx]= data.data.title;
        console.log(x_title);
    });
});

如果你正在使用较新的浏览器,我会使用forEach方法。兼容性列表可以在这里找到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Browser_compatibility

这实际上工作得很好,但你得到一个空数组,因为你的getJSON调用是异步的,你的console.log在它返回数据之前触发。

示例,注意工作是在success回调函数中完成的。