javascript - 使用运算符扩展 RxJS Observable 类

标签 javascript typescript ecmascript-6 rxjs rxjs5

Observable 类如何通过应用内置的 RxJS 运算符来扩展它?

我想做这样的事情:

class TruthyObservable extends Observable {
  constructor(subscriber) {
    super(subscriber);

    return this.filter(x => x);
  }
}

class TruthyMappedObservable extends TruthyObservable {
  constructor(subscriber) {
    super(subscriber);

    return this.map(x => `'${x}'`);
  }
}

这可以在没有构造函数返回的情况下完成吗?

最佳答案

这在很大程度上取决于您想要做什么,但假设您想要制作一个行为非常类似于默认 Observable.create(...)TruthyObservable > 但只传递偶数:

import { Observable, Observer, Subscriber, Subject, Subscription } from 'rxjs';
import 'rxjs/add/operator/filter';

class TruthyObservable<T> extends Observable<T> {

    constructor(subscribe?: <R>(this: Observable<T>, subscriber: Subscriber<R>) => any) {
        if (subscribe) {
            let oldSubscribe = subscribe;
            subscribe = (obs: Subscriber<any>) => {
                obs = this.appendOperators(obs);
                return oldSubscribe.call(this, obs);
            };
        }

        super(subscribe);
    }

    private appendOperators(obs: Subscriber<any>) {
        let subject = new Subject();

        subject
            .filter((val: number) => val % 2 == 0)
            .subscribe(obs);

        return new Subscriber(subject);
    }

}

let o = new TruthyObservable<number>((obs: Observer<number>) => {
    obs.next(3);
    obs.next(6);
    obs.next(7);
    obs.next(8);
});

o.subscribe(val => console.log(val));

这会打印到控制台:

6
8

查看现场演示:https://jsbin.com/recuto/3/edit?js,console

通常继承 Observable 的类会覆盖实际上在内部进行订阅的 _subscribe() 方法,但在我们的例子中,我们想使用回调,我们可以自己发出值(因为这个 Observable 本身不发射任何东西)。如果 _subscribe() 方法存在,它会被 _subscribe 属性遮盖,因此如果我们只是覆盖此方法,我们将无法向其添加任何运算符。这就是为什么我用另一个函数将 _subscribe 包装在构造函数中,然后通过与 appendOperators 中的 filter() 链接的 Subject 传递所有值() 方法。请注意,我在 obs = this.appendOperators(obs) 处用 Subject 替换了原来的 Observer。

最后,当我调用 eg. obs.next(3); 实际上,我将值推送到 Subject,过滤它们并将它们传递给原始的 Observer

关于javascript - 使用运算符扩展 RxJS Observable 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41366938/

相关文章:

javascript - Jquery如何获取稍后加载的元素中的更改事件

javascript - 获取两个数组中具有匹配值的对象

javascript - 将参数传递给 forEach.call 中的函数

javascript - 用 laravel-mix 编译的 ES6 库不起作用

ecmascript-6 - 解构时可空嵌套对象上的 ES6 默认参数

javascript - HighCharts 饼图,50 多个标签,未显示全部

javascript - 使用 Typescript+VSCode 调试 Node.js 异步/等待

javascript - 在 React 中使用泛型定义 props

angular - NGRX 效果调度了一个无效的 Action

javascript - 使用 Django 作为后端,将所选选项从一个表单传递到同一 html 页面中的另一个表单