Сделайте что-нибудь, если refCount субъекта RxJ падает до нуля - PullRequest
0 голосов
/ 31 октября 2018

Я работаю над сервисным уровнем, который управляет подписками.

Я предоставляю предметно-наблюдаемые данные для потребителей, как это:

const subject = new Subject();
_trackedSubjects.push(subject);
return subject.asObservable();

Различные потребители могут контролировать канал, поэтому к каждому субъекту может быть прикреплено несколько наблюдаемых.

Я бы хотел следить за счетом subject.observers, и если он когда-нибудь упадет до 0, сделайте некоторую очистку в моей библиотеке.

Я посмотрел на refCount, но это доступно только в Observable.

Я бы хотел найти что-то вроде:

subject.onObserverCountChange((cur, prev) =>
  if(cur === 0 && prev !== 0) { cleanUp(subject) }
)

Есть ли способ автоматической очистки подобным образом по теме?

1 Ответ

0 голосов
/ 31 октября 2018

Вместо использования Subject - вам, вероятно, следует описать логику настройки / очистки при создании наблюдаемого. Смотрите пример:

const { Observable } = rxjs; // = require("rxjs")
const { share } = rxjs.operators; // = require("rxjs/operators")

const eventSource$ = Observable.create(o => {
  console.log('setup');
  let i = 0
  const interval = setInterval(
    () => o.next(i++),
    1000
  );

  return () => {
    console.log('cleanup');
    clearInterval(interval);
  }
});
const events$ = eventSource$.pipe(share());

const first = events$.subscribe(e => console.log('first: ', e));
const second = events$.subscribe(e => console.log('second: ', e));

setTimeout(() => first.unsubscribe(), 3000);
setTimeout(() => second.unsubscribe(), 5000);
<script src="https://unpkg.com/rxjs@6.2.2/bundles/rxjs.umd.min.js"></script>
...