我正试图从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;
}
}
}
在本例中,我收到一条消息'Uncaught TypeError:无法读取.done(console.log('test))的未定义'属性'done',并且没有从console.log(nextPageToken)中读取任何内容,因为该部分也在收到响应之前执行。
显然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);
});
(除了之外,我建议你去读一本JS书,以加强你对这类典型模式的理解。)