我正在使用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