この問題の一般的な解決策を見つけることができないようですが、これを最初に遭遇することはできません。私はまた、ここで間違ったアプローチをとっているかもしれないと思う。お知らせ下さい。複数のコールバックを収集してタスクを完了した後にコールする方法
私は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
ですコールバックを格納する方法...
ジョブが完了したら複数のコールバックを呼び出すより良い方法はありますか?
こんにちはマット、提案していただきありがとうございます。私は非同期モジュールを認識しており、すでにアプリで頻繁に使用しています。しかし、それは私の問題を解決するものではありません(例えば、実行後に追加のコールバックを提供することはできません)。 –
私は何かを逃したと心配しました。申し訳ありません。 – mattmcmanus