我正在尝试将包含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)
这是小提琴
答案 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