Node.js回调和递归



我正在使用Google API获取邮箱中所有消息的列表。API正在列出列表,并且每次呼叫都会返回下一页,因此我必须递归地称其为:

const fetch = (cb, next) => {
    google.gmail('v1').users.messages.list({
        auth: oauth2Client,
        userId: 'me',
        pageToken: next
    }, cb)
}
const store = (err, result) => {
    // do something with result and then
    if (result.nextPageToken) {
        fetch(store, result.nextPagetToken)
    }
}
fetch(store)

有更好的方法可以避免递归,所以我不破坏堆栈?

而不是:

fetch(store, result.nextPagetToken)

您可以使用:

process.nextTick(fetch, store, result.nextPagetToken);

但是,如果在messages.list()回调中已经完成了类似的事情,那么甚至可能不需要。此外,除了使用--harmony标志时,JS已经支持了适当的尾部调用优化,并且自版本6.5.0以来就可以使用:

请参阅:
  • http://node.green/#es2015-optimisation-proper-tail-calls--tail-call-optimisation-

,即使在最古老的节点中,我的TCO模块也用于无限递归。

我恐怕我不知道Google API,但总的来说您应该在寻找承诺:

使用承诺|Google API

最新更新