Многозначные наблюдаемые и устаревшие данные, возвращаемые сервером - PullRequest
0 голосов
/ 19 декабря 2018

Работа над приложением angular 6.Сценарий похож на описанный здесь Угловые перехватчики HttpClient , похожи, но не идентичны:

В моем сценарии нет кэша на стороне клиента, сервер возвращает данные немедленно, хотя и устарел, ноклиент должен быть обновлен, даже с устаревшими данными, после получения устаревших данных на сервер выполняется второй вызов, на этот раз установка refresh = true, где сервер может потратить время, но вернет текущие данные.

Когда вызов завершается во второй раз, клиент снова обновляется (на этот раз со свежей информацией)

Это моя попытка, она работает, но чувствует себя неуклюже.

Есть ли способ сделать его лучше?(более точно соответствует rxjs / реактивному способу)

intercept(req: HttpRequest<any>, next: HttpHandler) {      

 let stale = false;
 let response: any;

 return next.handle(req)
   .pipe(
     filter(event => event instanceof HttpResponse),
     tap(event => {          
       if (event['body'].expired) {
         stale = true;
       }
       response = event;
     }),
     switchMap(event => {
       if (stale) {
         req.body['refresh'] = true;
         const freshResults$ = next.handle(req);
         return freshResults$.pipe(startWith(response));
       } else {
         return of(response);
       }
     })
   );

}

1 Ответ

0 голосов
/ 19 декабря 2018

Как то так?

const [ok$, expired$] = next.handle(req).pipe(
    filter(event => event instanceof HttpResponse)
    partition((({body}) = !body.expired))
)

return merge(ok$, expired$.pipe(switchMap((response) => {
    const newReq = {...req, body: {...req.body, refresh: true}};
    return next.handle(newReq)/* not sure why you need pipe(startWith(response)) */;
})));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...