如何将操作函数添加到从可观察量订阅返回的一次性

How to add action function to Disposable returned from subscribe on an Observable?

本文关键字:观察 返回 一次性 操作 函数 添加      更新时间:2023-09-26

你有一个可观察的,然后你订阅了它。返回值是一次性的。 如何添加在释放该一次性实例时要调用的函数?

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

当调用dispose()时,我想调用一个调试函数,例如console.log('Dispose ....')。 在实际应用程序中,我想执行一些非 rxjs 清理和 UI 通知操作。 可能很简单,但我在 API 中看不到它。 感谢。

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

更新

也接近您想要的,但不完全如此,您可以使用using运算符(文档)。它允许使用dispose方法创建一个对象,当释放对相关可观察量的订阅时将调用该对象。

更新 2

查看源代码,finally实际上在释放对其可观察量的订阅时执行操作。这包括终止或手动调用订阅上的dispose()。这似乎非常接近您想要实现的目标。

最好是测试。请随时向我们更新结果。

一次性用品与事件源相关联。原则是事件源正在与非 Rx 世界交互,并且当没有人再订阅时,可能需要执行一些清理。

如果你可以在调用subscribe返回的Disposable中放一个钩子,那么它就不会有太大用处:你知道什么时候调用dispose()这样你就可以在那里处理清理逻辑,如果其他代码调用dispose()它可能在链下Disposable上, 这可能不会影响您的订阅。

听起来你试图利用副作用,这不一定符合RxJS API的精神。如果您需要关闭某些网络连接或类似的东西,那么也许您应该使用自定义可观察对象,它会创建一个一次性来清理自身。

一个简单的例子(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();
    }
})