我似乎找不到这个问题的通用解决方案,即使我觉得我不能成为第一个遇到这个问题的人。我也怀疑这可能是我首先在这里采取了错误的方法。让我知道。
我有一个 Expressjs 应用程序,它与各种 API(主要是 OAuth2)交互。一旦请求进入应用程序,就会检查它是否具有访问令牌以从 API 获取数据。如果令牌过期,它将请求一个新令牌。
现在,当我的应用同时收到第二个请求时,需要完全相同的 API,我想避免再次调用访问令牌。
我所做的是使用“收集器”,其中可以为给定键存储回调。存储键回调的第一个请求会在完成任务后调用收集器回调。所有后续回调都被排入队列并稍后使用收集器回调调用。
这是简单的收集器类(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>
完成工作后是否有更好的方法来调用多个回调?