如何在 request.execute 到 gapi.client.youtube 完成后才执行函数?
How to execute a function only after a request.execute to gapi.client.youtube has completed?
我正在尝试从 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: Cannot read 属性 'done' of undefined' for the .done (console.log('test)) 并且 console.log(nextPageToken) 中没有任何内容,因为该部分也在收到响应之前执行。
显然 request.execute()
没有 return 任何东西 (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()
returns,在这种情况下是 undefined
,所以你调用 .done(undefined)
显然不会'不要照你的意思去做。相反,您需要执行 guest271314 建议的操作:
getAPromise().done(function(arg) {
console.log(arg);
});
(顺便提一下 that,我建议你 go read a JS book 加强对此类典型模式的理解。)
我正在尝试从 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: Cannot read 属性 'done' of undefined' for the .done (console.log('test)) 并且 console.log(nextPageToken) 中没有任何内容,因为该部分也在收到响应之前执行。
显然 request.execute()
没有 return 任何东西 (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()
returns,在这种情况下是 undefined
,所以你调用 .done(undefined)
显然不会'不要照你的意思去做。相反,您需要执行 guest271314 建议的操作:
getAPromise().done(function(arg) {
console.log(arg);
});
(顺便提一下 that,我建议你 go read a JS book 加强对此类典型模式的理解。)