[英]Resolve not called in a recursive promise function
我做了一个递归函数,以实现Google Calendar Events列表与其JavaScript API的增量同步,除了resolve()
之外,其他一切似乎都可以正常工作,我不明白为什么...
我想念什么?
syncEvents (calendarId) {
let eventsItems = []
let syncToken = null
let pageToken = null
function next(params) {
return new Promise((resolve) => {
gapi.client.calendar.events.list( params ).then( (response) => {
syncToken = response.result.nextSyncToken;
pageToken = response.result.nextPageToken;
let items = response.result.items
eventsItems.push(items)
if (pageToken) {
return next({
'calendarId': params.calendarId,
'pageToken': pageToken,
'syncToken': syncToken
})
}
if (syncToken) {
console.log('ok now resolve!') // <= This is called...
resolve(response)
}
})
})
}
next({'calendarId': calendarId}).then( (result) => {
console.log(eventsItems) // <= And this is not called...
})
}
谢谢!
如果我可以尝试使用一些新的异步/等待糖,那么您不需要任何递归函数:)
async syncEvents(calendarId) {
const eventsItems = []
const query = {calendarId}
while (true) {
const response = await gapi.client.calendar.events.list(query)
const {nextSyncToken, nextPageToken, items} = response.result
eventsItems.push(items)
if (nextPageToken) {
query.pageToken = nextPageToken,
query.syncToken = nextSyncToken
} else {
return eventsItems
}
}
}
它只是在递归堆栈的末尾解决最深层的承诺。 决不会因堆栈中更高的承诺而被调用,因为返回要在解决之前被调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.