2 ms·
I have a similar pattern when using an rxjs pipeline to do async tasks in response to changes in other values. The typical pattern would be readonly foo =
by MobiusHorizons 4y ago
I have a similar pattern when using an rxjs pipeline to do async tasks in response to changes in other values. The typical pattern would be
readonly foo = bar.pipe(
switchMap(v => doTask(v)),
shareReplay(1),
);
Where doTask returns a promise or an AsyncSubject. The shareRelpay allows foo to cache the last value so any late subscriber will get the most recent value. This has a problem of returning cached values while new work is happening (eg while a network request is in progress) so instead I like to write
readonly foo = bar.pipe(
map(v => doTask(v),
shareReplay(1),
switchMap(v => v),
);
This way the shareReplay is caching the promise instead of the result. With this pattern I can interact with this pipeline from code like so
async someEventHandler(userInput) {
this.bar.next(userInput);
const result = await firstValueFrom(this.foo);
…
}
Without the pattern, this code would get the old result if there was ever any cached value