如何将操作函数添加到从可观察量订阅返回的一次性
How to add action function to Disposable returned from subscribe on an Observable?
你有一个可观察的,然后你订阅了它。返回值是一次性的。 如何添加在释放该一次性实例时要调用的函数?
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();
}
})
- 节点导出返回一个空对象
- 敲除:可观察数组没有被正确绑定——只有1个结果显示,而api返回6
- 如何按属性从可观察数组返回项
- 挖空扩展可观察 取消引用时返回未定义
- Knockoutjs 可观察的布尔值返回奇怪的结果
- Angular2 Http 请求返回没有映射方法的可观察性
- 重新调用返回 Rxjs 可观察的函数
- 如何将操作函数添加到从可观察量订阅返回的一次性
- Knockout JS-如何为可观察字段返回空字符串
- 是否有可能在运算符内部返回新的可观察项,嵌套可观察项
- 击倒可观察<数字>在绑定到typescript中的输入时返回字符串
- 观察对嵌套数组的更改不会返回添加/更改的元素
- 从可观察的订阅中获取返回值
- 如何观察对象方法返回的属性变化
- 输入一个返回的可观察对象
- 吞下我可观察到的错误并返回缓存值——所有这些都可以保持订阅的活力
- 返回一个空的可观察量
- 的可观察函数返回了一个分块数组
- Angular2:返回承诺中的可观察值
- 如何在 JavaScript 中观察函数返回值