服务器返回的多值可观察且过时的数据

时间:2018-12-19 20:02:10

标签: angular rxjs reactive-programming

正在处理angular 6应用程序。该方案类似于此处Angular HttpClient interceptors所述的方案,相似但不相同:

在我的情况下,没有客户端缓存,服务器虽然已过时,但仍立即返回数据,但是即使收到了陈旧的数据,也需要更新客户端,这是在第二次调用服务器时,设置refresh = true可能需要花费一些时间,但是会返回当前数据。

当呼叫第二次结束时,客户端将再次刷新(这次具有新信息)

这是我的尝试,正在运行,但感觉笨拙。

有没有办法使它更好? (更多内联于rxjs / active方法)

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 :(得分:0)

像这样吗?

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)) */;
})));