上周,我回答了一个RxJS 问题,在那里我与另一位社区成员进行了讨论:“我应该为每种特定的副作用创建订阅,还是应该总体上减少订阅?” 我想知道在完整的反应式应用方法中使用什么方法,或者何时从一种方法切换到另一种方法。这将帮助我甚至其他人避免不必要的讨论。
设置信息
- 所有示例均在TypeScript中
- 为了更好地关注问题,不使用生命周期/构造函数进行订阅并保持框架无关
- 想象一下:在构造函数/生命周期init中添加了订阅
- 想象一下:取消订阅是在生命周期中完成的
什么是副作用(角度样本)
- 用户界面中的更新/输入(例如
value$ | async
) - 组件的输出/上游(例如
@Output event = event$
) - 不同层次结构上不同服务之间的交互
示例用例:
- 两个功能:
foo: () => void; bar: (arg: any) => void
- 两个源可观察到的:
http$: Observable<any>; click$: Observable<void>
foo
http$
发出后调用,不需要任何值bar
在click$
发出后被调用,但需要的当前值http$
案例:为每种特定副作用创建订阅
const foo$ = http$.pipe(
mapTo(void 0)
);
const bar$ = http$.pipe(
switchMap(httpValue => click$.pipe(
mapTo(httpValue)
)
);
foo$.subscribe(foo);
bar$.subscribe(bar);
案例:总体上减少订阅
http$.pipe(
tap(() => foo()),
switchMap(httpValue => click$.pipe(
mapTo(httpValue )
)
).subscribe(bar);
总之我的看法
我可以理解订阅首先会使Rx景观更加复杂的事实,因为您必须考虑订阅者应如何影响管道(例如,不影响管道)(共享或不观察)。但是,您分离代码的次数越多(关注的焦点越多:什么时候发生),将来维护(测试,调试,更新)代码越容易。考虑到这一点,我总是为我的代码中的任何副作用创建一个可观察的源和一个订阅。如果我的两个或更多副作用是由完全相同的可观察源触发的,则我共享我的可观察对象并分别订阅每个副作用,因为它可能具有不同的生命周期。