У меня есть массив наблюдаемых в качестве хранилища данных, и я хочу убедиться, что горячие не устареют.Например, если нет подписчиков на наблюдаемое, мне не нужно его обновлять, но если есть подписчики, то без обновления не должно пройти более 5 минут.
тайм-аут , кажется, то, что я хочу, но я не хочу, чтобы он выдавал ошибку, я просто хочу запустить код, когда он истекает (аналогично tap
). timeoutwith еще ближе, потому что я могу заменить его на наблюдаемое.Однако это не кажется «правильным», и после одного тайм-аута наблюдаемая замена не будет иметь присоединенного оператора timeoutWidth
.
function getData(index){
return database[index].pipe(timeoutWith(5*60*1000, database[index]))
}
Один из подходов, о котором я только что подумал, - это добавить рекурсив addTimeout
метод, но это кажется хакерским:
private addTimeout(obs:Observable<any>, time:number):Observable<any>{
return obs.pipe(timeoutWith(time,this.addTimeout(obs,time)));
}
РЕДАКТИРОВАТЬ, добавляя код с использованием тайм-аута / повторных попыток:
const staleDataTime = 5*60*1000; // 5 minutes
// bhs makes it so you can update the value manually whenever you want
let bhs = new BehaviorSubject<Summary>(initialSummary);
// This will reset bhs after the timeout
bhs.pipe(timeout(staleDataTime)).subscribe(success=>null,err=>bhs.next(null));
let obs = bhs.pipe(
switchMap(val=>val?of(val):this.retreiveSummary(filter)),
timeout(staleDataTime),
retry(),
distinctUntilChanged((a:Summary,b:Summary) => a.count==b.count && a.sum == b.sum),
share()
);
obs.subscribe(val=>console.log("obs val: ", val));