繁体   English   中英

在递归promise函数中未调用解析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM