この問題に最初に遭遇することはできないと感じていますが、この問題の一般的な解決策を見つけることができないようです。また、そもそもここで間違ったアプローチを取っているのではないかと思います。お知らせ下さい。
さまざまな API (主に OAuth2) とやり取りする Expressjs アプリがあります。リクエストが受信されると、アプリは API からデータを取得するためのアクセス トークンを持っているかどうかを確認します。トークンの有効期限が切れている場合は、新しいトークンが要求されます。
ここで、その間にアプリがまったく同じ API を必要とする 2 番目のリクエストを受信したときに、アクセス トークンの 2 番目の呼び出しを回避したいと考えています。
私がしているのは、特定のキーのコールバックを保存できる「コレクター」を使用することです。キーのコールバックを格納するための最初のリクエストは、タスクの完了後に呼び出すコレクタ コールバックを取得します。後続のすべてのコールバックはキューに入れられ、後でコレクタ コールバックで呼び出されます。
これは単純な Collector クラス (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
このクラス内にコールバックを保存することが正しい方法かどうかはわかりませんが、データベース (Redis) を使用するには、コールバックを保存する方法を見つける必要があります…</p>
ジョブが完了したら、複数のコールバックを呼び出すより良い方法はありますか?