rxjs - 扩展 Observable 并设置外部源
问题描述
我想扩展 Observable 并设置另一个来源(例如另一个行为主题)
例如 NgRx 在这里做: https ://github.com/ngrx/platform/blob/9.0.0/modules/store/src/store.ts#L20
但是 RxJS Observable 在“Observable.source”上给出了弃用警告:https ://github.com/ReactiveX/rxjs/blob/6.5.5/src/internal/Observable.ts#L25
此代码使用已弃用的“Observable.source” - 它可以工作:
const source: BehaviorSubject<any> = new BehaviorSubject(1);
class ObsStore extends Observable<any> {
constructor() {
super();
this.source = source; // Observable.source is deprecated
}
// Implement custom methods here
customMethod1() {}
}
export const obsStore$ = new ObsStore();
obsStore$.subscribe(data => console.log('output', data));
source.next(2);
// output 1
// output 2
我仍然想知道它是否可以安全使用source
。是否有另一种方法可以为 Observable 设置外部源?
NgRx 还实现了 lift 方法: https ://github.com/ngrx/platform/blob/9.0.0/modules/store/src/store.ts#L90-L95 不确定是否需要。
这是一个 stackblitz 示例: https ://stackblitz.com/edit/extend-observable
注意:我想扩展 Observable 并向其添加一些自定义公共方法。自定义 Observable 的行为应该像一个 BehaviorSubject 但它不应该暴露next
or getValue
。实际上只有pipe
自定义方法应该是公开的。
解决方案
我从 Ben Lesh (RxJS) 那里找到了这条推文: https ://twitter.com/BenLesh/status/1366787138898055169
“我强烈建议人们不要从任何库扩展 Observable(或者实际上是他们不拥有的任何类型)。”
NgRx 团队的 Alex Okrushko 也认为 NgRx 最好不要扩展 Observable。 https://twitter.com/AlexOkrushko/status/1379028869789970432
组合会更好地工作+未来的证明。
推荐阅读
- flutter - 如果我将文件放在 getApplicationDocumentsDirectory() 目录中,文件将存储在哪里?它会增加应用程序的大小吗?
- spring - Mongo 聚合查询到等效的 Spring Mongo 数据
- asp.net - 在 ASP.NET MVC 中获取经过身份验证的身份用户数据
- matlab - ismember 只取第一个数字
- android - react native中的expo代码总是出错
- c++ - VS Code 无法在集成终端中运行 C/C++
- javascript - 停止渲染正在渲染的图表
- mysql - 使用 select 从另一个数据库中删除数据
- java - 无法生成 .log 文件,但有输出控制台
- php - php循环函数中的多个返回