我正在尝试从youtube播放列表的多个页面获取结果。问题是我收到第二个请求(第二页)只有在收到第一个请求后才能执行。我已经尝试过承诺,推迟,回调,似乎没有任何工作。
function requestVideoPlaylist(playlistId, pageToken, pages) {
$('#video-container').html('');
var requestOptions = {
playlistId: playlistId,
part: 'snippet',
maxResults: 10
};
if (typeof(pages)==='undefined') {
pages = 2;
}
var i = 0
while (i++ < pages){
var request = gapi.client.youtube.playlistItems.list(requestOptions);
request.execute(function(response) {
nextPageToken = response.result.nextPageToken;
var playlistItems = response.result.items;
console.log(playlistItems)
if (playlistItems) {
$.each(playlistItems, function(index, item) {
displayResult(item.snippet);
});
} else {
$('#video-container').html('Sorry you have no uploaded videos');
}
}).done(console.log('test'));
if (nextPageToken) {
console.log(nextPageToken)
requestOptions.pageToken = nextPageToken;
}
}
}
在这个示例中,我收到一条消息&#39; Uncaught TypeError:无法读取属性&#39;已完成&#39; .done(console.log(&#39; test))的未定义&#39; 以及 console.log(nextPageToken)中没有任何内容该部分也在收到回复之前执行。
答案 0 :(得分:1)
显然request.execute()
不返回任何内容(undefined
),更不用说Promise了,所以将函数调用直接粘贴到回调中,如下所示:
request.execute(function(response) {
nextPageToken = response.result.nextPageToken;
var playlistItems = response.result.items;
console.log(playlistItems);
if (playlistItems) {
$.each(playlistItems, function(index, item) {
displayResult(item.snippet);
});
loadNextPage(nextPageToken); // <--
} else {
$('#video-container').html('Sorry, you have no uploaded videos');
}
});
顺便说一句,你不能做.done(console.log(...))
,因为这相当于:
var foo = console.log(...);
getAPromise().done(foo);
和foo
是console.log()
返回的内容,在这种情况下是undefined
,因此您正在调用.done(undefined)
,这显然不符合您的意思。相反,你需要做一些像guest271314建议的那样的事情:
getAPromise().done(function(arg) {
console.log(arg);
});
(除了 之外,我建议你go read a JS book加强对这种典型模式的理解。)