在 rxjs 中,如果调用了 AggregateCallback
方法,我还应该调用取消订阅吗?
例如,我有一个来自 complete
的 timer
,我设置为 5 秒。
在调用 subscribe 函数后,我还应该运行 unsubscribe 定时器吗?
rxjs
答案 0 :(得分:1)
如果调用了 complete
方法,我还应该调用 unsubscribe
吗?
没有。一个 observable 只能完成或出错一次。完成或错误的 observable 完成。无需退订。
上面调用的定时器只会发出一次然后完成。除非您想取消计时器,否则无需取消订阅。如果你给计时器第二个参数,那么它会变得更像 interval
。然后你必须退订。
任何短暂的 observable 都会自行完成。使用 of
或 from(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
。