我试图通过每个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回调函数中完成的。