Сигнал, когда ReplaySubject "закончил"

Я пытаюсь найти хороший способ сообщить, что ReplaySubject в настоящее время "пуст".

import {ReplaySubject} from 'rxjs/ReplaySubject';
const rs = new ReplaySubject<Object>();

 // ...
constructor(){
  this.sub =  rs.subscribe(...);
}

каждый раз, когда вызывается конструктор, он будет воспроизводить все элементы субъекта. Однако мой вопрос - есть ли какое-то событие, которое мы можем слушать, которое говорит нам, когда предмет становится пустым?

Единственное, о чем я могу думать, это запускать пользовательское / другое событие, когда тема готова, что-то вроде этого:

rs.next({done:true});

Является ли передача данных методу next() лучшим способом сообщить, что ReplaySubject (временно) пуст / не содержит событий?

2 ответа

Поскольку субъект также является наблюдателем, вы можете позвонить complete() после финала next() вызов. Затем вы можете прослушать его с 3-м параметром subscribe(...) метод.

const rs = new ReplaySubject<Object>();
rs.next({a: 1})
rs.complete()

rs.subscribe(
    obj => console.log(obj),
    error => {},
    () => console.log('completed')
);
// Outputs
// {a: 1} completed

Ну, теперь, я полагаю, вы могли бы настроить вторичную наблюдаемую, чтобы сказать вам, что является последним воспроизводимым элементом:

const last$ = rs.replay(1);

Затем вам нужно просто объединить последние и отсканировать... как только вы достигнете элемента, испущенного последними $, ваш ReplaySubject завершит воспроизведение:

this.sub = Observable.combineLatest(
  rs,
  last$.take(1)
).scan((acc: { item: Object, isReplay: boolean }, curr: [Object, Object]) => {
    return {item: curr[0], isReplay: acc.isReplay && curr[0] !== curr[1]};
  }, {isReplay: true}
).subscribe(...);
Другие вопросы по тегам