你有一个Observable,然后你订阅它。返回值是Disposable。如何在放置Disposable实例时添加要调用的函数?
clickStream.subscribe(....).dispose();
当调用dispose()时,我想调用一个调试函数,例如console.log('Disposing ....')。在真实的应用程序中,我想做一些非rxjs清理和UI通知操作。可能很简单,但我没有在API中看到它。 THX。
答案 0 :(得分:2)
我想知道finally
是否适用于您的用例(documentation)。根据文档,Invokes a specified action after the source observable sequence terminates gracefully or exceptionally
。请注意,这与调用dispose
时调用的回调不完全相同,但我认为这可能足以满足您的需求,您可以将其用于清理操作。
更新
也接近你想要的,但不是那么接近,你可以使用using
运算符(documentation)。它允许使用dispose
方法创建一个对象,该方法在处理对相关observable的订阅时将被调用。
更新2
查看source code,finally
实际执行了对其observable的订阅时的操作。这包括终止或手动调用订阅dispose()
。这看起来非常接近你想要实现的目标。
最好是测试。请告诉我们最新的结果。
答案 1 :(得分:2)
一次性用品与事件来源相关联。原则是事件源与非Rx世界交互,并且可能需要在没有人订阅时进行一些清理。
如果你可以勾选从Disposable
调用返回的subscribe
,那么它就没什么用了:你知道什么时候你 dispose()
所以你可以在那里处理清理逻辑,如果一些名为dispose()
的其他代码可能位于链上的Disposable
,这可能不会影响您的订阅。
听起来你正试图利用副作用,这不一定符合RxJS API的精神。如果你需要关闭一些网络连接或类似的东西,那么也许你应该使用一个自定义的Observable,它创建一个Disposable来自我清理。
一个简单的例子(Observable.fromEvent
的简化实现)可能如下所示:
function fromEvent(obj, evt){
var subject = new Rx.Subject();
function listener(e){
subject.onNext( e );
}
return Rx.Observable.create( function( observer ){
var disp = subject.subscribe( observer );
obj.addEventListener( evt, listener );
return Rx.Disposable.create(function(){
// All the clean-up code goes here
obj.removeEventListener( evt, listener );
disp.dispose();
})
});
}
var events$ = fromEvent( button, 'click');
var count = 0;
var unsub = events$.subscribe( function(){
console.log('click');
count++;
if( count > 5){
unsub.dispose();
}
})