Angular& RX:改进订阅收集

时间:2016-12-07 10:51:55

标签: angular typescript rxjs rxjs5

更新

找到解决方案后,我根据接受的答案写了一个小助手ng2-rx-collector,使其更容易使用。希望它可以帮助某人一次又一次地面对同样的问题。

原始问题

假设我们在hot observables上有一个包含两个订阅的组件。我们在ngOnDestroy订阅它们并取消订阅public ngOnInit() { this.s1 = o1.subscribe(console.debug.bind(console)); this.s2 = o2.subscribe(console.debug.bind(console)); } public ngOnDestroy() { this.s1.unsubscribe(); this.s2.unsubscribe(); } 以避免内存泄漏/意外行为:

DisposeBag

我喜欢Rx,但每次我需要遵循这个时,我真的想要自杀:

  1. 为每个订阅创建一个私人订阅属性
  2. 将此属性分配给订阅(这看起来很丑陋,因为真正的逻辑出现在右侧)
  3. 取消订阅destroy
  4. 上的每个订阅

    有没有办法改善这个?

    E.g。在RxSwift中他们有private let bag = DisposeBag(); ... o1.subscribe(...).addDisposableTo(bag); 以改进过程,翻译成打字稿将是:

    Subscription

    然后只摧毁它一次。问题是我找不到任何类似的if ($type == 1) { 函数。

    任何想法/提示都会受到热烈欢迎。

2 个答案:

答案 0 :(得分:5)

你可以这样做:

private teardown$ = new Subject<void>();

public ngOnInit() {
    o1.takeUntil(this.teardown$).subscribe(console.debug.bind(console));
    o2.takeUntil(this.teardown$).subscribe(console.debug.bind(console));
}

public ngOnDestroy() {
   this.teardown$.next();
}

答案 1 :(得分:2)

你所描述的曾经被称为RxJS 4中的“一次性用品”(如果我错了,请纠正我)或RxPHP。在RxJS 5中,这称为订阅,但目的完全相同。

在以下示例中,我有两个源Observable。我用一个Subscription对象包装了他们的取消订阅调用,该对象将回调作为调用其unsubscribe()方法时使用的参数。

var source1 = Observable.interval(250);
var source2 = Observable.interval(350);

let sub1 = source1.subscribe(val => console.log(val));
let sub2 = source2.subscribe(val => console.log(val));

let subscriptions = new Subscription(() => {
    sub1.unsubscribe();
    sub2.unsubscribe();
});

setTimeout(() => {
    subscriptions.unsubscribe();
}, 3000);

同样,我也可以从Subscription获取第一个source1.subscribe并添加另一个Subscription,并使用unsubscribe()调用add()来调用var source1 = Observable.interval(250); var source2 = Observable.interval(350); let subscriptions = source1.subscribe(val => console.log(val)); subscriptions.add(source2.subscribe(val => console.log(val))); setTimeout(() => { subscriptions.unsubscribe(); }, 3000); 方法:

{{1}}

有关详细信息,请查看源代码:https://github.com/ReactiveX/rxjs/blob/master/src/Subscription.ts