【问题标题】:RxJS unsubscribe from inner observable when the source completes当源完成时,RxJS 取消订阅内部 observable
【发布时间】:2020-08-11 05:45:18
【问题描述】:

我有一个返回 observable 的函数,当使用 Subject 发生一些内部事情时,它会自动取消订阅。这是一个显示问题的简单版本:

const subject = new Subject();

const source = fromEvent(document.querySelector("h1"), "click").pipe(
  takeUntil(subject)
);

fromEvent(document.querySelector("p"), "click").subscribe(() => {
  subject.next();
});

问题在于,如果有人订阅了source 并使用了高阶可观察对象,那么当Subject 发出时,它将不会订阅内部可观察对象:

source.pipe(mergeMap(() => interval(1000))).subscribe(x => console.log(x));

有一种方法可以解决这个问题,而无需强制消费者致电unsubscribe

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:

    问题是source 完成并不意味着当前运行的间隔结束。如果你想在源关闭时杀死内部的 observables,你可以这样做,你只需要多播 source 以避免创建更多的 h1 事件监听器。

    const subject = new Subject();
    
    const source = fromEvent(document.querySelector("h1"), "click").pipe(
      takeUntil(subject)
    );
    
    const sharedSource = source.pipe(share());
    const emitOnComplete = last(null, null);
    const sourceIsDone = sharedSource.pipe(emitOnComplete);
    
    sharedSource.pipe(
      mergeMap(() => interval(1000)),
      takeUntil(sourceIsDone)
    );
    

    【讨论】:

    • 我需要 takeUntil 在源上,而不是在使用它的那个上。
    • 更新了答案以考虑反馈。
    猜你喜欢
    • 2017-12-17
    • 2020-05-25
    • 2021-11-16
    • 2016-07-07
    • 2019-03-06
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多