我试图制作一个JS剧本,从YouTube频道获取最后一个视频。我想从每个视频中获取标题,ID和缩略图,以便在我的页面中使用它们。我的第一个选择是创建一个包含所有视频的全局数组,以便在其他函数中使用它(createThumbnail,createPlayer ...)。这是我拍摄频道最新视频的代码:
user = 'PiewDiePie'
var videos = [];
$.getJSON('http://gdata.youtube.com/feeds/users/' + user + '/uploads?alt=json-in-script&format=5&callback=?', null, function(data) {
var feed = data.feed;
$.each(feed.entry, function(i, entry) {
var video = {
title: entry.title.$t,
id: entry.id.$t.match('[^/]*$'),
thumbnails: entry.media$group.media$thumbnail
};
videos.push(video);
});
alert('Inside function: ' + videos[0].title);
});
alert('Outside function: ' + videos[0].title);
// Functions with the videos array
这里的问题是第一个警报显示标题,但第二个警告显示以下错误:
Uncaught TypeError: Cannot read property 'title' of undefined
最后,我改变了我的脚本,避免使用全局范围变量,但我无法理解为什么这不起作用。我是javascript的新手,可能这对专家来说很明显......
非常感谢
答案 0 :(得分:1)
你的问题是按时间顺序排列的。
您对YouTube API的请求是异步,这意味着在您的代码继续执行后,其余代码将会发生。因此,当您的第二个警报触发时,请求尚未完成,因此videos
数组尚未填充。
相反,您的第二个警报需要等待请求解决。
更改
$.getJSON(...
到
var req = $.getJSON(....
然后将第二个警报包裹在请求的回调中
req.done(function() { alert('Outside function: ' + videos[0].title); });