На самом деле, это не так просто, и принятый ответ не очень универсален. Вы хотите проверить, является ли ReplaySubject
пустым в этот конкретный момент времени.
Однако, если вы хотите, чтобы сделать это действительно совместимы с ReplaySubject
необходимо учитывать также windowTime
параметр, который определяет«время жизни» для каждого значения, которое проходит через этот объект. Это означает, что ваш cache
пуст или нет изменится во времени.
ReplaySubject
имеет способ _trimBufferThenGetEvents
, который делает то, что вам нужно. К сожалению, этот метод является конфиденциальным, поэтому вам нужно сделать небольшой «взлом» в JavaScript и напрямую расширить его prototype
.
import { ReplaySubject } from 'rxjs';
// Tell the compiler there's a isNowEmpty() method
declare module "rxjs/ReplaySubject" {
interface ReplaySubject<T> {
isNowEmpty(): boolean;
}
}
ReplaySubject.prototype['isNowEmpty'] = function() {
let events = this._trimBufferThenGetEvents();
return events.length > 0;
};
Затем с помощью этого ReplaySubject
проста:
let s = new ReplaySubject<number>(1, 100);
s.next(3);
console.log(s.isNowEmpty());
s.next(4);
setTimeout(() => {
s.next(5);
s.subscribe(val => console.log('cached:', val));
console.log(s.isNowEmpty());
}, 200);
setTimeout(() => {
console.log(s.isNowEmpty());
}, 400);
Обратите внимание, что некоторые вызовы к isNowEmpty()
возвращения true
, в то время как другие возвращаются false
. Например, последний возвращает false
, потому что в то же время значение было недействительным.
Этот пример напечатает:
true
cached: 5
true
false
Смотреть демо: https://jsbin.com/sutaka/3/edit?js,console
«пустой» 'Observable' не очень содержательное понятие в этом контексте, я думаю, вы приравнивая проблемы между' 'Observer' и Observable'. Что вы пытаетесь достичь этим? – paulpdaniels