【发布时间】:2018-07-31 12:42:29
【问题描述】:
我需要一个接一个地运行 2 个函数:getUserPlaylists(接收播放列表)和 getPlaylistTracks(接收提供的播放列表的曲目)。
一个响应最多可以有 50 首曲目,所以如果我想获取其余曲目,我需要使用 PageToken。问题是我不能让递归函数getPlaylistTracks 等到递归完成。
function getPlaylistsWithTracks () {
return new Promise((resolve, reject) => {
getUserPlaylists()
.then(function (playlists) {
playlists.forEach(
async function (playlistObj) {
await getPlaylistTracks(playlistObj).then(function (tracks) {
playlistObj['tracks'] = tracks
})
})
console.log('resolve')
resolve(playlists)
})
})
}
function getPlaylistTracks (playlistObj, pageToken) {
return new Promise((resolve, reject) => {
let playlistTracks = []
let requestOptions = {
'playlistId': playlistObj['youtubePlaylistId'],
'maxResults': '50',
'part': 'snippet'
}
if (pageToken) {
console.log('pageToken:', pageToken)
requestOptions.pageToken = pageToken
}
let request = gapi.client.youtube.playlistItems.list(requestOptions)
request.execute(function (response) {
response['items'].forEach(function (responceObj) {
let youtubeTrackTitle = responceObj.snippet.title
if (youtubeTrackTitle !== 'Deleted video') {
let youtubeTrackId = responceObj.snippet.resourceId.videoId
playlistTracks.push({
youtubePlaylistId: playlistObj.playlistId,
youtubePlaylistTitle: playlistObj.playlistTitle,
youtubeTrackId: youtubeTrackId,
youtubeTrackTitle: youtubeTrackTitle,
})
}
})
// Here I need to wait a bit
if (response.result['nextPageToken']) {
getPlaylistTracks(playlistObj, response.result['nextPageToken'])
.then(function (nextPageTracks) {
playlistTracks = playlistTracks.concat(nextPageTracks)
})
}
})
resolve(playlistTracks)
})
}
getPlaylistsWithTracks()
在我的控制台中,我看到了下一个:
> resolve
> pageToken: 123
> pageToken: 345
但是,我想看resolve最后一个。
如何等待递归执行?
【问题讨论】:
-
将解析调用放入请求响应中
-
@Occam'sRazor,没有帮助。控制台中的顺序仍然相同(
resolve第一个,然后是pageTokens) -
Here I need to wait a bit- 你需要在 .then 里面解析 ... 在没有nextPageToken的情况下解析应该在else块中完成
标签: javascript recursion promise es6-promise