首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在任务完成后收集多个回调进行调用

如何在任务完成后收集多个回调进行调用
EN

Stack Overflow用户
提问于 2012-04-24 22:33:44
回答 2查看 1.2K关注 0票数 2

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

我有一个Expressjs应用程序与各种App (主要是OAuth2)的互动。一旦有请求进入,应用程序就会检查它是否有访问令牌来从API获取数据。如果令牌过期,它将请求一个新的令牌。

现在,当我的应用程序同时收到第二个请求,需要完全相同的API时,我希望避免再次调用访问令牌。

我所做的是使用一个“收集器”,其中可以存储给定键的回调。存储键的回调的第一个请求是在完成任务后调用收集器回调。所有后续回调都将入队,并在以后使用收集器回调进行调用。

这是简单的收集器类(CoffeeScript)

代码语言:javascript
复制
# 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),我必须找到一种存储回调…的方法

有没有更好的方法在作业完成后调用多个回调?

EN

回答 2

Stack Overflow用户

发布于 2012-04-25 18:59:12

为什么你不把你的回调聚合到一个数组中循环,当你的原始调用完成时执行每个包含的函数呢?

它可以像下面这样简单:

代码语言:javascript
复制
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);

如果你想让它更美观,你可以把它包装成你想要的任何数据结构。

票数 3
EN

Stack Overflow用户

发布于 2012-04-24 23:11:29

我对你的问题没有具体的答案,但你应该看看异步模块。我认为这是朝着正确方向迈出的一步:https://github.com/caolan/async

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10300130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档