angular - shareReplay: pot reseta sau seta dimensiunea bufferului la 0 astfel încât noile abonamente să trebuiască să aștepte un nou emit


Am următorul observabil:

this.roles$ = auth.User$
            .pipe(tap((val: JwtUser|null) => this.logger.debug('Session updated, updating permissions %o', val)))
            .pipe(switchMap(this.getRoles.bind(this)))
            .pipe(shareReplay({refCount: true, bufferSize: 1}));

Metoda getRoles() efectuează o cerere HTTP de fiecare dată când User$emite. Ultima valoare preluată este redată tuturor noilor abonați. Totuși, când User$emite, nu vreau ca abonații să primească ultima valoare. În schimb, vreau ca ei să aștepte pentru valoarea nou preluată. Am crezut că aș putea realiza acest lucru resetând/golind buffer-ul de fiecare dată când User$emite, dar nu reușesc să găsesc cum să fac asta. Există o altă abordare pe care aș putea încerca-o sau o modalitate de a realiza asta?

Mulțumesc!

Răspuns #1

Dacă am înțeles corect, de fapt îți place o dimensiune a bufferului de 0. Totuși, shareReplay(0) emite ultima valoare a sursei, la fel cum face shareReplay(1) (vezi această explicație despre shareReplay). Poți folosi share și un abonat fictiv în schimb:

this.roles$ = auth.User$
            .pipe(tap((val: JwtUser|null) => this.logger.debug('Session updated, updating permissions %o', val)))
            .pipe(switchMap(this.getRoles.bind(this)))
            .pipe(share());
// keep `refCount` above 0 using a dummy subscription
this.roles$.subscribe(() => {});

Vă rog să mă anunțați printr-un comentariu dacă acesta corespunde cerințelor dumneavoastră.