首页 > 解决方案 > RxJS takeUntil 在高阶 observable 之前

问题描述

我在takeUntil高阶可观察之前使用运算符:

import { of, Subject, fromEvent, interval } from "rxjs";
import { takeUntil, mergeMap } from "rxjs/operators";

const subject = new Subject();

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

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

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

但是我们这段代码,我有内存泄漏,因为它没有取消订阅interval. 我可以将它移动到链的末端,但这很容易出错。开发人员很容易犯这个错误。例如,有没有办法让它保持这样,并取消订阅interval

标签: javascriptrxjs

解决方案


作为管道的最新操作员,对于 write或任何其他操作员takeUntil来说是正常的事情。mergeMap当人们把它作为第一个运营商时,他们应该明白他们为什么这样做。

例如秒表中的 rxjs 示例takeUntil不是最新的,因为它应该在中间以支持新的开始点击。

interval(1000).pipe(
  skipUntil(this.start),
  takeUntil(this.stop$),
  repeat(),
);

你可以:

但是当然人们应该理解编写代码的目的:)


推荐阅读