2017-03-15 13 views
3

Googleのメールボックス内のすべてのメッセージのリストを取得するためにgoogle apiを使用しています。 APIは、リストのページ付け、およびすべての呼び出し、それは次のページを返しますので、私は再帰的に呼び出す必要がありとされていますnode.jsコールバックと再帰

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) 

あなたが使用することができます:代わりの

答えて

1

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

が、そのようなことは既にmessages.list()コールバックで行われているならば、それも必要ではないかもしれません。適切な末尾呼び出しの最適化は、既にJSでサポートし、あなたが--harmonyフラグを使用する場合、バージョン6.5.0以降のノードで利用可能であるほかに、以下を参照してください

そして、私のtcoモジュールもあるがノードの最も古いバージョンであっても、無限再帰のために。

+0

'process.nextTick(、、result.nextPagetTokenをストアフェッチ);'ルックス私が探していたものとまったく同じです。テールコール再帰を使うのはちょっと怖いので、気付かずにいつかそれを壊すのは簡単すぎるだろう。ありがとう。 – 599644

1

私はGoogleのAPIを知らない怖いが、一般的に、あなたが約束されているはずです話す:

Using Promises | Google API

+0

ありがとうございます。私は約束を使わないようにしていました。 – 599644

+1

それを避けて、少なくとも試してみるまで、受け入れられた答えを先に進まないでください。私を信頼してください:あなたの指関節を裂き、ある午後に約束を学びます。それは言語への「ポケモンの進化」スタイルの変更です、あなたは一度も振り返らないでしょう。 –