我似乎无法找到这个问题的通用解决方案,尽管我觉得我不是第一个遇到这个问题的人。我还怀疑我可能一开始就采取了错误的方法。让我知道。
我有一个 Expressjs 应用程序,可以与各种 API(主要是 OAuth2)交互。一旦请求进入,应用程序就会检查它是否具有从 API 获取数据的访问 token 。如果 token 过期,它将请求一个新的 token 。
现在,当我的应用程序同时收到第二个请求(需要完全相同的 API)时,我希望避免再次调用访问 token 。
我所做的是使用“收集器”,其中可以存储给定键的回调。存储键回调的第一个请求将获取收集器回调,以便在完成任务后调用。所有后续回调都会排队并稍后通过收集器回调进行调用。
这是简单的 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),我必须找到一种存储回调的方法......
是否有更好的方法在工作完成后调用多个回调?
最佳答案
为什么不将回调聚合到一个数组中,循环遍历该数组,在原始调用完成时执行每个包含的函数?
它可以很简单:
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);
如果您想让它更漂亮,您可以将其包装到您想要的任何数据结构中。
关于javascript - 如何收集多个回调以在任务完成后调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10300130/