Rx JS отписаться от внутренней наблюдаемой, когда источник завершает - PullRequest
1 голос
/ 27 апреля 2020

У меня есть функция, которая возвращает наблюдаемый, который автоматически отписывается, когда какая-то внутренняя вещь происходит, используя Предмет. Вот простая версия, в которой показана проблема:

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?

1 Ответ

0 голосов
/ 28 апреля 2020

Проблема в том, что source завершение не означает конец текущего интервала (ов). Если вы хотите убить внутреннюю наблюдаемую вещь при закрытии источника, вы можете сделать это, вам просто нужно многоадресную рассылку 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)
);
...