Javascript 在递归承诺函数中未调用Resolve

Javascript 在递归承诺函数中未调用Resolve,javascript,google-api,promise,synchronization,Javascript,Google Api,Promise,Synchronization,我已经用他们的JavaScript API实现了一个递归函数,除了resolve(),其他一切似乎都正常工作,我不明白为什么 我错过了什么 syncEvents (calendarId) { let eventsItems = [] let syncToken = null let pageToken = null function next(params) { return new Promise((resolve) =&

我已经用他们的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...
      })

  }
syncEvents(日历ID){
让eventsItems=[]
设syncToken=null
让pageToken=null
函数下一步(参数){
返回新承诺((解决)=>{
gapi.client.calendar.events.list(参数)。然后((响应)=>{
syncToken=response.result.nextSyncToken;
pageToken=response.result.nextPageToken;
让items=response.result.items
eventsItems.push(项目)
如果(pageToken){
下一个返回({
“calendarId”:params.calendarId,
“pageToken”:pageToken,
“syncToken”:syncToken
})
}
如果(同步令牌){
console.log('ok now resolve!')//{

console.log(eventsItems)//它只是在递归堆栈末尾解析最深的承诺。由于在解析之前就调用了返回,因此不会对堆栈中更高的承诺调用Resolve。如果我可以尝试使用一些新的async/Wait sugar,那么您不需要任何递归函数:)


你不应该把你的下一个fn包装在承诺中,因为gapi已经返回了一个承诺。当你返回下一个时,
return()
resolve()
在这里返回
gapi.client.calendar.events.list(…).then()
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
    }
  }
}