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上调用的。感谢所有的反馈。