有条件地过滤依赖关系注入的异步数据?



我有一个围绕依赖注入构建的 NodeJS 应用程序。应用可以同时运行其函数(模块(的任意组合,并且从同一异步资源请求数据的任何模块都将共享单个请求。因此,如果模块 A 和模块 B 都需要来自https://example.com/path/to/resource的数据,而我同时运行这两个模块,那么该请求将发出一次,结果将传递给两个模块。伟大。

但是,如果模块 C 只需要来自同一资源的部分数据怎么办?如果我运行模块 A-C,那么它可以等待数据并过滤结果,但是当我只想运行模块 C 时,这是浪费的.相反,如果我只有模块 C 请求路径 +?filter=foo,那么当只运行模块 C 时这是有效的,但如果 A-C 是两个请求,则会浪费相同数据的超集。

看到了一种围绕此问题创建优化技术的方法,但我对依赖注入有些陌生,我担心我最终会创建一个反模式或复杂且难以维护的东西。处理此问题的最佳方法是什么?

编辑

澄清一下,在理想的解决方案中,该示例只有三个可能的流,并根据正在运行的模块集请求两个可能的 URL 之一:

集合 = {A}, {B},
  1. or {A, B}。我们请求/path/to/resource并将结果按原样传递给模块。
  2. 设置 = {C}。我们请求/path/to/resource?filter=foo并将结果按原样传递给模块。
  3. 集合 = {C, A}, {C, B},
  4. 或 {C, A, B}。我们要求/path/to/resource。对于模块 A/B,我们按原样传递结果。但是对于模块 C,我们首先处理 foo 的结果,然后再传递它。

这样,C 永远不需要知道请求的 URL 是什么,不会浪费任何数据,也不需要刻录不必要的 CPU 周期。

我会使用两个Promise.all((: 1.对于所有不需要结果的请求 2.对于所有需要结果的请求

假设模块 = [] 是要与对象一起执行的模块数组:

{
requiredResult: boolean;
url: string;
}
runCombination(modules = []){
let needResultPromises = [];
let backgroundPromises = [];
modules.forEach((eachModule) => {
if(eachModule.requiredResult){
needResultPromises.push(RunModule(eachModule.url))
}else{
backgroundPromises.push(RunModule(eachModule.url))
}
})
Promise.all(backgroundPromises);
return Promise.all(needResultPromises);
}

因此,从上面的函数中,您可以看到一些 promise all 都在后台运行,而带有 return 的那个将等待结果。

希望这对你有帮助。

最新更新