У меня есть две наблюдаемые, getUser и getUserAvatar .
Оба они выдают два значения - кешируются немедленно с помощью BehaviorSubject и реальное после сетевого запроса.
Теперь код работает следующим образом:
1) Отправьте запрос на получение пользователя и немедленно отправьте кэшированного пользователя
2) После запуска кэшированного пользователя код попадает внутрь concatMap и в первый раз выполняет getUserAvatar
3) getUserAvatar отправляет запрос на сервер и немедленно отправляет кэшированный userAvatar
4) Все выполнено и кешированный пользователь вернул кешированный аватар
5) Через некоторое время реальный пользователь вернулся и getUser снова выдает значение
6) На этом шаге я хочу запретить вызов concatMap во второй раз , поскольку запрос к серверу уже выполняется, я просто хочу вернуться к 'USER LOADED.
sendGetRequest('/user/').pipe(
concatMap(() => {
// HERE, after user data loaded, I have url for his avatar
return sendGetRequest('/avatar/').pipe();
}),
map(() => {
return 'USER LOADED';
})
)
Код для запроса к серверу
sendGetRequest(url: string, ignoreCache?: boolean): any {
let responseSubj = new Subject();
const cachedData = this.cache.getItemForUrl(url);
const cacheAllowed = cachedData && !ignoreCache;
if (cacheAllowed) {
responseSubj = new BehaviorSubject(cachedData);
}
const getFromServer = this.http.get(environment.API_SERVER_URL + url, this.addAuth()).pipe(
filter((res: any) => {
if (cacheAllowed && JSON.stringify(cachedData) === JSON.stringify(res)) {
responseSubj.complete();
return false;
}
this.cache.setItemForUrl(url, res).then(() => {
responseSubj.complete();
});
return true;
}),
catchError((error, caught) => {
console.log('ERROR FROM GET REQUEST', error);
return throwError(error);
})
);
return merge(responseSubj, getFromServer);
}