在 rxjs 中完成调用后我应该取消订阅吗?

时间:2021-03-23 08:56:14

标签: rxjs

在 rxjs 中,如果调用了 AggregateCallback 方法,我还应该调用取消订阅吗?

例如,我有一个来自 completetimer,我设置为 5 秒。

在调用 subscribe 函数后,我还应该运行 unsubscribe 定时器吗?

rxjs

2 个答案:

答案 0 :(得分:1)

问题:

<块引用>

如果调用了 complete 方法,我还应该调用 unsubscribe 吗?

没有。一个 observable 只能完成或出错一次。完成或错误的 observable 完成。无需退订。

上面调用的定时器只会发出一次然后完成。除非您想取消计时器,否则无需取消订阅。如果你给计时器第二个参数,那么它会变得更像 interval。然后你必须退订。

广义:

任何短暂的 observable 都会自行完成。使用 offrom(array) 创建的 Promise、HTTP 调用、可观察对象就是这种情况。这些通常不需要取消订阅,除非某些业务逻辑另有规定。

长期存在的 observables 不会自行完成,必须以某种方式进行管理。用户交互往往没有定义的结束(想想像按钮点击这样的 DOM 事件)。 interval 也没有定义的结束。

如何退订

最好的解决方案是使用代表您处理订阅/取消订阅的运营商。在最好的情况下,他们不需要额外的认知负荷,并且在更奇特的情况下能够相对较好地控制/管理错误(远距离动作较少)。

大多数高阶运算符都这样做(concat、merge、concatMap、switchMap、mergeMap 等)。其他操作符(例如 take、takeUntil、takeWhile 等)让您可以使用更具声明性的样式来管理订阅。

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

答案 1 :(得分:0)

当然你应该退订,只需在控制台日志中查看 token。它有道具:closed: true, _subscriptions: null, isStopped: true

比较如果没有取消订阅: closed: false isStopped: false _subscriptions: Array[1]

如果您想要完整的值,则必须完成您的 Subject,在这种情况下 - timer