Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将操作函数添加到可观察的订阅返回的一次性操作中?_Javascript_Rxjs - Fatal编程技术网

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

Javascript 如何将操作函数添加到可观察的订阅返回的一次性操作中?,javascript,rxjs,Javascript,Rxjs,你有一个可观察的,然后你订阅它。返回值是一次性的。如何添加要在释放该一次性实例时调用的函数 clickStream.subscribe(....).dispose(); 调用dispose()时,我想调用一个调试函数,例如console.log('Disposing…')。在一个真正的应用程序中,我想做一些非rxjs清理和UI通知操作。可能很简单,但我在API中没有看到它。Thx.我想知道最终是否能满足您的用例()。根据文档,在源可观察序列正常或异常终止后调用指定的操作。请注意,这与调用dis

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

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

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

我想知道
最终是否能满足您的用例()。根据文档,
在源可观察序列正常或异常终止后调用指定的操作。请注意,这与调用
dispose
时调用的回调并不完全相同,但我认为这可能足以满足您的需要,您可以将其用于清理操作

更新

您也可以使用
using
操作符()。它允许使用
dispose
方法创建一个对象,该方法将在相关可观察对象的订阅被释放时调用

更新2

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


最好的办法是测试。请随时向我们报告最新结果。

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

如果您可以在调用subscribe
返回的
dispose
中放置一个钩子,那么它就没有多大用处:您知道何时调用
dispose()
,因此您可以在那里处理清理逻辑,如果其他代码调用
dispose())
它可能位于链下游的
一次性
上,这可能不会影响您的订阅

这听起来像是在试图利用副作用,这不一定符合RXJSAPI的精神。如果你需要关闭一些网络连接或者类似的东西,那么也许你应该使用一个定制的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();
    }
})

这与处置不同<代码>最后
错误
完成
事件时触发。您可以在不发生上述任何一种情况的情况下处理一个可观察对象。这些是Rxjs的优点,术语有点混乱。我想你只处理了一个订阅。可观察对象确实会终止、出错或发出值,但它们不会被处理。也就是说,我的答案是最终使用
进行清理,而不是在没有更好的选择的情况下进行清理。我同意这并不能回答这个问题,但它仍然是有用的。这很公平。它甚至可能涵盖OP的用例,这取决于他实际想要实现的目标。尽管我认为Peter Hall的答案在我介绍的用例方面“更好”,但现在使用finally操作符已经足够了。我通过将其添加到UI中退出按钮上的点击流来测试它。令人费解的是,它确实是在dispose上调用的。感谢所有的反馈。