javascript - 如何收集多个回调以在任务完成后调用

标签 javascript design-patterns node.js

我似乎无法找到这个问题的通用解决方案,尽管我觉得我不是第一个遇到这个问题的人。我还怀疑我可能一开始就采取了错误的方法。让我知道。

我有一个 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/

相关文章:

design-patterns - 对对象进行版本控制的设计模式有哪些?

design-patterns - 工厂方法模式的实际用途是什么?

c++ - Node.js 插件计时器上下文

javascript - Hive - Thrift - readMessageBegin 中缺少版本,旧客户端?

javascript - 删除全屏 Highcharts 的固定高度

javascript - Cordova 与 Angular,如何获取 deviceready 事件

javascript - 在单独的 Div Jquery 中的倒数计时器时钟

javascript - 如何将包含带有任意文本的 CSV 数据的字符串拆分为 JavaScript 数组数组?

java - 整洁建筑设计模式

node.js - NodeJS 上的 CasperJS - 找不到模块 casper