【发布时间】:2018-08-20 13:00:43
【问题描述】:
我已经阅读了 Ben 的 article 关于取消订阅 via 、takeUntil 、takeWhile(谓词版本)
I've used it like this example in my Angular app
但是有些东西我不明白。
假设我有一个 Observable,它会在很长一段时间后发出值:
const source = Rx.Observable.interval(10000);
var isContinue=true;
const example = source.takeWhile(val => isContinue)
.subscribe(val => {},()=>{},()=>console.log('complete'));
setTimeout(function (){isContinue=false},3000) //somewhere in destructor
嗯,这只会在 10 秒后显示“完成”,而不是在 3 秒后。
所以基本上如果我有一个订阅 Observable 的组件并且该 observable 长时间不发出值,它仍然会引用我的对象,从而导致缓慢的内存泄漏。
问题:
如何在我设置好后立即使用 takeWhile 运算符取消订阅
isContinue 值。
我不想信任可能不会发出值的服务并保留对我的组件的引用。
【问题讨论】:
-
您可以通过
example订阅自己致电unsubscribe。如果您想确保在完成或取消订阅时发生某些操作,您可以使用finally()运算符或使用example.add(() => { console.log('complete') })手动添加处置处理程序 -
@martin 谢谢。所以基本上这些运营商不能依赖。 在 takeWhile 值改变之后,它必须发出至少一个值....为了注意到变化
-
是的,这就是
takeWhile的用途。但老实说,我不明白takeUntil有什么问题。我认为这是最简单的方法。 -
takeWhile 应该使用你的布尔值,试试这个:
source.takeWhile(this.isContinue) -
Observable.subscribe返回Subscriptiongithub.com/ReactiveX/rxjs/blob/… 但实际上它返回订阅者 github.com/ReactiveX/rxjs/blob/master/src/internal/util/… 扩展Subscription并具有complete方法 github.com/ReactiveX/rxjs/blob/master/src/internal/…
标签: javascript angular rxjs