У меня есть ситуация, когда мне нужно, чтобы наблюдаемое излучало два значения.Первое значение должно быть отправлено немедленно, и все подписчики должны получить значение немедленно.Второе значение может занять некоторое время, но все подписчики также должны получить это значение.
В настоящее время я достигаю этого, делая следующее:
import {Observable} from 'rxjs';
import {tap, startWith} from 'rxjs/operators';
@Injectable()
export class CacheInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler) {
const cachedResponse = cache.get(req);
const results$ = sendRequest(req, next);
return cachedResponse ? results$.pipe(startWith(cachedResponse)) : results$;
}
}
function sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req).pipe(
tap(event => {
if (event instanceof HttpResponse) {
cache.put(req, event);
}
})
);
}
export class HttpCache {
cache = new Map();
get(req: HttpRequest<any>): HttpResponse<any> | undefined {
// ...
}
put(req: HttpRequest<any>, response: HttpResponse<any>): void {
// ...
}
}
const cache: HttpCache = new HttpCache();
Как видите, я пытаюсь сделать results$.pipe(startWith(cachedResponse))
.
Похоже, что происходит то, что я всегда получаю значение results$
, а значение cachedResponse
никогда не излучается.Любая помощь будет оценена.