我有一个工具栏,可以单独禁用/隐藏每个工具。这些工具依赖于其他系统事件并发出单独的事件以配置其可用性。工具栏使用CombineLatest将所有工具组合在一起并发出工具栏配置。
combinateLatest正在监听40多个事件。
这将是一个性能问题吗?合并最新可以消费多少事件有实际限制?
答案 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