更新
找到解决方案后,我根据接受的答案写了一个小助手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,但每次我需要遵循这个时,我真的想要自杀:
有没有办法改善这个?
E.g。在RxSwift中他们有private let bag = DisposeBag();
...
o1.subscribe(...).addDisposableTo(bag);
以改进过程,翻译成打字稿将是:
Subscription
然后只摧毁它一次。问题是我找不到任何类似的if ($type == 1) {
函数。
任何想法/提示都会受到热烈欢迎。
答案 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