我应该在rxjs中调用完成后取消订阅吗?
在rxjs中,如果调用了我应该在rxjs中调用完成后取消订阅吗?,rxjs,Rxjs,在rxjs中,如果调用了complete方法,我是否也应该调用unsubscribe 例如,我有一个来自rxjs的计时器,设置为5秒 调用subscribe函数后,我是否也应该从计时器中运行unsubscribe import { timer } from "rxjs"; const token = timer(5 * 1000).subscribe({ next: () => { console.log("xxx"); to
complete
方法,我是否也应该调用unsubscribe
例如,我有一个来自rxjs
的计时器,设置为5秒
调用subscribe函数后,我是否也应该从计时器中运行unsubscribe
import { timer } from "rxjs";
const token = timer(5 * 1000).subscribe({
next: () => {
console.log("xxx");
token.unsubscribe(); // <---- should I do it to to free memory?
},
complete: () => {
console.log("aaa");
}
});
从“rxjs”导入{timer};
常量令牌=计时器(5*1000)。订阅({
下一个:()=>{
控制台日志(“xxx”);
令牌。取消订阅();//{
控制台日志(“aaa”);
}
});
当然您应该取消订阅,只需在控制台日志中检查令牌即可。它有一些道具:关闭:true、\u订阅:null、isStopped:true
如果未取消订阅,请进行比较:
closed:false:false\u订阅:数组[1]
如果您想要完整的值,您必须完成主题
,在这种情况下-计时器
问题:
如果调用了complete
方法,我是否也应该调用unsubscribe
不可以。一个可观察对象只能完成或出错一次。一个已完成或出错的可观察对象已经完成。不需要取消订阅
如上所述,计时器将只发出一次,然后完成。除非您要取消计时器,否则无需取消订阅。如果您给计时器第二个参数,则它将更改为更像interval
。然后您必须取消订阅
广义:
任何短期的可观察对象都将自行完成。承诺、HTTP调用、使用of
或from(array)
创建的可观察对象就是这种情况。除非某些业务逻辑另有规定,否则通常不需要取消订阅
长期存在的观察对象不能独立完成,必须以某种方式进行管理。用户交互往往没有定义的结束(想想DOM事件,比如按钮单击)。interval
s也没有定义的结束
如何取消订阅
最好的解决方案是那些使用运营商代表您处理订阅/取消订阅的解决方案。在最佳情况下,运营商不需要额外的认知负荷,而在更奇特的情况下,运营商可以相对较好地控制/管理错误(远距处的恐怖行为较少)
大多数高阶操作符都会这样做(concat、merge、concatMap、switchMap、mergeMap等)。其他操作符(如take、takeUntil、takeWhile、ect)允许您使用更具声明性的样式来管理订阅
在可能的情况下,这些都是可取的,因为它们都不太可能在使用它们的团队中引起奇怪的错误或混乱。因此,如果我使用计时器
调用后是否应该取消订阅?最好这样做,是的。