Rxjs refCount обратный вызов для очистки, как только каждый подписчик отписался? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть наблюдаемое, которое недолговечно (запрос http).

Я использую publishReplay(1) и refCount(), чтобы при попытке получить к нему доступ одновременно,он вернет то же значение без повторного вызова http.

Но если все подписки отписаны, мне нужно выполнить некоторую очистку.

Я не могу использовать finalize, потому что:

  • если я использую его до publishReplay, то он закрывается после выполнения http-запроса
  • , еслиЯ использую его после refCount, он будет запущен, как только одна заметная отмена подписки (вместо того, когда все отписались)

Так что в принципе я хотел бы передать обратный вызов refCount и вызовите этот обратный вызов, когда количество подписок достигнет 0. Но это не работает так.Можно ли как-то «быть предупрежденным», когда все подписчики отписались?

Самый простой способ, о котором я могу подумать сейчас, - это создать собственный оператор, который бы в значительной степени расширил refCount, добавивобратный вызов.

Есть мысли получше?Я уверен, что есть лучший способ сделать это.

Спасибо!

1 Ответ

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

Я пробовал, и, кажется, он работает правильно.

Вот как это используется:

import { of, timer } from 'rxjs'; 
import { map, publishReplay, take } from 'rxjs/operators';
import { refCountCb } from './refCountCb';

const source = timer(2000, 10000).pipe(
  map(x => `Hello ${x}!`),
  publishReplay(1),
  refCountCb(() => console.log('MAIN CLOSED'))
);

source.pipe(take(1)).subscribe(x => console.log(x));
source.pipe(take(1)).subscribe(x => console.log(x));

Вывод:

Hello 0!
Hello 0!
MAIN CLOSED

Я построилпользовательский оператор refCountCb, основанный на источнике из refCount.По сути, это просто добавление обратного вызова, поэтому я не буду копировать и вставлять весь код здесь, но он доступен на stackblitz .

Полная демонстрация: https://stackblitz.com/edit/rxjs-h7dbfc?file=index.ts

Если выЕсли у вас есть другие идеи, пожалуйста, поделитесь ими, я был бы рад найти разные решения!

...