Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
我应该在rxjs中调用完成后取消订阅吗?_Rxjs - Fatal编程技术网

我应该在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

在rxjs中,如果调用了
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)允许您使用更具声明性的样式来管理订阅


在可能的情况下,这些都是可取的,因为它们都不太可能在使用它们的团队中引起奇怪的错误或混乱。

因此,如果我使用
计时器
调用后是否应该取消订阅?最好这样做,是的。