单独获取每个YouTube视频ID的请求

时间:2014-05-30 17:05:02

标签: javascript jquery json

我正在尝试将包含youtube ID的数组中的每个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/

2 个答案:

答案 0 :(得分:2)

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

Example fiddle,请注意工作是在成功回调函数内完成的。

答案 1 :(得分:2)

数组是空白的,因为它在所有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