如何在Observable上从subscribe返回的Disposable添加动作函数?

时间:2016-01-17 19:34:04

标签: javascript rxjs

你有一个Observable,然后你订阅它。返回值是Disposable。如何在放置Disposable实例时添加要调用的函数?

clickStream.subscribe(....).dispose();

当调用dispose()时,我想调用一个调试函数,例如console.log('Disposing ....')。在真实的应用程序中,我想做一些非rxjs清理和UI通知操作。可能很简单,但我没有在API中看到它。 THX。

2 个答案:

答案 0 :(得分:2)

我想知道finally是否适用于您的用例(documentation)。根据文档,Invokes a specified action after the source observable sequence terminates gracefully or exceptionally。请注意,这与调用dispose时调用的回调不完全相同,但我认为这可能足以满足您的需求,您可以将其用于清理操作。

更新

也接近你想要的,但不是那么接近,你可以使用using运算符(documentation)。它允许使用dispose方法创建一个对象,该方法在处理对相关observable的订阅时将被调用。

更新2

查看source codefinally实际执行了对其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();
    }
})