Javascript 如何仅在完成对gapi.client.youtube的请求后执行函数?
我正在尝试从youtube播放列表的多个页面获取结果。问题是,只有在收到第一个页面的数据后,我才能执行第二个请求(对于第二个页面)。我尝试过承诺、延期、回电,但似乎没有任何效果Javascript 如何仅在完成对gapi.client.youtube的请求后执行函数?,javascript,youtube-api,Javascript,Youtube Api,我正在尝试从youtube播放列表的多个页面获取结果。问题是,只有在收到第一个页面的数据后,我才能执行第二个请求(对于第二个页面)。我尝试过承诺、延期、回电,但似乎没有任何效果 function requestVideoPlaylist(playlistId, pageToken, pages) { $('#video-container').html(''); var requestOptions = { playlistId: playlistId, part: 's
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;
}
}
}
功能请求视频播放列表(播放ID、页面标记、页面){
$('#视频容器').html('');
var请求选项={
playlid:playlid,
部分:'代码片段',
最大结果:10
};
如果(页面类型)=='undefined'){
页数=2页;
}
变量i=0
而(i++
在本例中,我收到一条消息“Uncaught TypeError:无法读取.done(console.log('test))的未定义属性“done”,并且从console.log(nextPageToken)中没有任何内容,因为该部分也会在收到响应之前执行。显然
request.execute()
不会返回任何内容(未定义的
),更不用说承诺了,所以将函数调用直接插入回调中,如下所示:
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');
}
});
而foo
是console.log()
返回的任何内容,在本例中是undefined
,因此您调用.done(undefined)
,这显然不会达到您的目的。相反,您需要执行guest271314建议的操作:
getAPromise().done(function(arg) {
console.log(arg);
});
(除此之外,我建议您加强对这类典型模式的理解。)尝试了
.done(function(){//do stuff})
?我甚至在示例中尝试了这一点(除了使用console.log),但它不起作用-我得到了“uncaughttypeerror:无法读取未定义的属性'done'。除非你指的是别的什么,或者在别的地方,或者?我在调用整个函数时也尝试过,但是.done()中的代码在收到响应之前执行。是否请求.execute
返回承诺
?尝试使用.then(function(){})
而不是.done()
?可以创建stacksnippets、JSFIDLE来演示吗?我无法获得youtube在JSFIDLE.net中工作的授权,但确实如此。问题似乎在于加载As for.then-它不起作用,因为request.execute没有返回承诺。对预期结果不完全确定?尽管可以使用单击打开新的窗口
getAPromise().done(function(arg) {
console.log(arg);
});