首页 > 解决方案 > 扩展 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 但它不应该暴露nextor getValue。实际上只有pipe自定义方法应该是公开的。

标签: rxjs

解决方案


我从 Ben Lesh (RxJS) 那里找到了这条推文: https ://twitter.com/BenLesh/status/1366787138898055169

“我强烈建议人们不要从任何库扩展 Observable(或者实际上是他们不拥有的任何类型)。”

NgRx 团队的 Alex Okrushko 也认为 NgRx 最好不要扩展 Observable。 https://twitter.com/AlexOkrushko/status/1379028869789970432

组合会更好地工作+未来的证明。


推荐阅读