gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:24:37 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com