RxJS:多少事件对于CombineLatest来说太多了?

时间:2018-07-09 16:30:44

标签: rxjs

我有一个工具栏,可以单独禁用/隐藏每个工具。这些工具依赖于其他系统事件并发出单独的事件以配置其可用性。工具栏使用CombineLatest将所有工具组合在一起并发出工具栏配置。

combinateLatest正在监听40多个事件。

这将是一个性能问题吗?合并最新可以消费多少事件有实际限制

1 个答案:

答案 0 :(得分:0)

很难这样说。

我认为将大量流合并本身并不是问题。

可能是:
 -让这些数据流经常发出价值
 -让这些流触发Angular变化检测(如果可能的话,可能值得在ng区域外运行它们)

也就是说,我认为这里的性能问题最终掩盖了概念问题。确实感觉您可能需要“单一事实来源”。了解Redux和Ngrx可能对您有很大帮助。

然后从唯一的商店中,您可以轻松地检索工具的可用性。

  

该工具依赖于其他系统事件并发出单个事件

Redux模式在应对此类挑战方面通常表现得很好:
 -异步
 -状态

听起来真的很适合这里。

如果您不知道从哪里开始,建议您先阅读Redux文档。这是我读过的最好的书之一:https://redux.js.org

一旦您了解了Redux的工作原理,以及它是否适合您,如果答案是肯定的,那么请看一下Ngrx。由于您似乎在大量使用流,因此如果您花时间先学习Redux,那么Ngrx绝对不是问题:https://redux.js.org

如果您决定采用这种方式,那么祝您在反应式和函数式编程的惊人旅程中好运:)

编辑11/07 : 如果您认为Redux过于强大,那么也许您可以构建一个行为类似的最小解决方案。以下内容是完全类型安全的,您可以更新多个属性,而无需在更新属性时触发最终流的次数。一次就够了:

import { BehaviorSubject } from 'rxjs';
import { tap } from 'rxjs/operators';

type YourDataType = {
  prop1: string,
  prop2: string,
  prop3: string,
  prop4: string,
  // ...
  prop40: string,
};

const properties$: BehaviorSubject<YourDataType> = new BehaviorSubject({
  prop1: '',
  prop2: '',
  prop3: '',
  prop4: '',
  // ...
  prop40: '',
});

const patchProperties = (updatedProperties: Partial<YourDataType>) =>
  properties$.next({
    ...properties$.getValue(),
    ...updatedProperties
  });

properties$
  .pipe(
    tap(x => console.log(JSON.stringify(x, null, 2)))
  )
  .subscribe()

patchProperties({
  prop3: 'new prop 3'
});

patchProperties({
  prop1: 'new prop 1',
  prop2: 'new prop 2',
  prop3: 'final prop 3',
  prop40: 'new prop 40',
});

产生以下输出:

{
  "prop1": "",
  "prop2": "",
  "prop3": "",
  "prop4": "",
  "prop40": ""
}

{
  "prop1": "",
  "prop2": "",
  "prop3": "new prop 3",
  "prop4": "",
  "prop40": ""
}

{
  "prop1": "new prop 1",
  "prop2": "new prop 2",
  "prop3": "final prop 3",
  "prop4": "",
  "prop40": "new prop 40"
}

这是一个Stackblitz演示:
https://stackblitz.com/edit/typescript-zafsnk?file=index.ts