Rxjs 每次订阅都需要取消订阅吗

Rxjs 每次订阅都需要取消订阅吗,rxjs,Rxjs,我正在尝试确定如何处理以下代码 let sub=myObservable.subscribe( v=>圆点(v), e=>handle(e), ()=>sub.unsubscribe(), ) 问题是 1.此代码不正确,因为myObservable同步完成,完成时将抛出NPE。 2.尽管我怀疑这里的退订电话是一种很好的做法。我情不自禁地觉得这可能没有必要,因为我在其他任何地方都没有看到这样做 我读过这篇文章,但它实际上让我比刚开始时更困惑 如果我这样做 let subA=myObservabl

我正在尝试确定如何处理以下代码

let sub=myObservable.subscribe(
v=>圆点(v),
e=>handle(e),
()=>sub.unsubscribe(),
)
问题是 1.此代码不正确,因为myObservable同步完成,完成时将抛出NPE。 2.尽管我怀疑这里的退订电话是一种很好的做法。我情不自禁地觉得这可能没有必要,因为我在其他任何地方都没有看到这样做

我读过这篇文章,但它实际上让我比刚开始时更困惑

如果我这样做

let subA=myObservable.pipe(take(1)).subscribe()
设subB=myObservable.pipe(takeUntil(foo)).subscribe()
我不再需要取消订阅subA和subB了吗

这里的subC怎么样

let subC=myObservable.pipe(finalize(()=>cleanupOtherResources()).subscribe()
或者我必须将所有订阅添加到对任何
BehaviorSubject
调用
subscribe()
的每个类的列表中,并立即取消订阅吗


谢谢

取消订阅始终是最佳做法。如果您知道类的clean-up方法实际上在cleanup-observable上发出,那么就可以使用takeUntil。take并不总是保证可观测的物体已经发射。在某些情况下,您可能知道observable肯定会至少发出一次,但仍有可能造成泄漏

假设一个可观察对象将完成的问题是,您不知道返回可观察对象的服务的内部是否发生了变化。如果您假设可观察到的是http请求,并在请求结束时完成,那么未来将可观察到的更改为缓存处理程序的重构现在已经创建了内存泄漏,因为您没有取消订阅

取消订阅也会取消任何正在进行的请求

像这样的语句的问题

let sub = myObservable.subscribe(
    v => doThing(v),
    e => handle(e),
    () => sub.unsubscribe(),
)
如果myObservable像Behavior Subject一样立即发射,则sub是未定义的。我会避免像那样自我退订,而是在主题上使用takeUntil

const finalise$ = new Subject();

myObservable.pipe(takeUntil(finalise$)).subscribe(
    v => doThing(v),
    e => handle(e),
    () => { finalise$.next(); },
);
此代码保证可以自动退订。

查看并