正在处理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);
}
})
);
}
答案 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)) */;
})));