Сигнал, когда 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(...);