2012-04-24 8 views
2

この問題の一般的な解決策を見つけることができないようですが、これを最初に遭遇することはできません。私はまた、ここで間違ったアプローチをとっているかもしれないと思う。お知らせ下さい。複数のコールバックを収集してタスクを完了した後にコールする方法

私はExpressjs AppをさまざまなAPI(主にOAuth2)とやりとりしています。リクエストが入ったら、APIからデータを取得するためのアクセストークンがあるかどうかをチェックします。トークンが期限切れになった場合、新しいトークンを要求します。

私のアプリケーションがその間に2回目のリクエストを受信したとき、まったく同じAPIが必要な場合は、2回目のアクセストークンの呼び出しを避けたいと思います。

私が行うことは、コールバックを特定のキーに格納できる「コレクタ」を使用することです。キーのコールバックを格納する最初の要求は、タスクを完了した後に呼び出すコレクタコールバックを取得します。後続のコールバックはすべて、エンキューされ、後でコレクタコールバックで呼び出されます。

これは私が見つけなければならないだろう、私はこのクラス内でコールバックを格納することは正しい方法であるかどうかわからないんだけど、データベース(Redisの)を使用するように簡単なコレクタークラス(CoffeeScriptの)

# Collect callbacks for tasks and execute all once the job is done 
module.exports = class Collector 
    constructor:()-> 
    @tasks = {} 
    add: (key, callback)-> 
    unless @tasks[key] 
     # Initiate callback list for the key with first callback 
     @tasks[key] = [callback] 
     return()=> 
     # Call all collected callbacks for the key 
     (callback.apply {}, arguments for callback in @tasks[key]) 
     # Reset callback list 
     @tasks[key] = null 
    else 
     # Add callback to existing list 
     @tasks[key].push callback 
     return false 

ですコールバックを格納する方法...

ジョブが完了したら複数のコールバックを呼び出すより良い方法はありますか?

答えて

0

あなたの問題に対する具体的な答えはありませんが、asyncモジュールをチェックアウトする必要があります。 https://github.com/caolan/async

+0

こんにちはマット、提案していただきありがとうございます。私は非同期モジュールを認識しており、すでにアプリで頻繁に使用しています。しかし、それは私の問題を解決するものではありません(例えば、実行後に追加のコールバックを提供することはできません)。 –

+0

私は何かを逃したと心配しました。申し訳ありません。 – mattmcmanus

2

元の呼び出しが完了したときに、含まれている各関数を実行して循環する配列にコールバックを集約しないのはなぜですか?

のような単純なものでした:あなたはそれをきれいにしたい場合は、あなたが好きなデータ構造にこれをラップすることができます

var dones = []; 

dones.push(function (err, res) { console.log('hoo'); }); 
dones.push(function (err, res) { console.log('ray!'); }); 

function whenDone(err, res) { 
    _.each(dones, function (done) { done(err, res); } }); 
} 

myWhateverFunction(whenDone); 

+0

これはまさに私が今行っていることです:)私はあなたが 'dones'のようにコールバックを収集しています。コールバックを与える最初のメソッドに' whenDone'メソッドを渡します。 (そしてすべての収集されたコールバックが呼び出されます) 違いは、指定されたキーによって識別される 'done'が異なります。それをクラスで包みます。 –

+0

これに追加するには:私がやることとあなたの提案が完全に機能すること。しかし、いったん何百回もコールバックを保存しなければならないのはいつですか?これはまだ動作しますか?そのファイルの中の配列は本当にそのようなデータを格納する正しい場所ですか? –

+0

あなたが近づいているのは、佐賀パターンと呼ばれるパターンです。 – MateodelNorte

関連する問題