代码之家  ›  专栏  ›  技术社区  ›  kmansoor

服务器返回的多值可观测陈旧数据

  •  0
  • kmansoor  · 技术社区  · 6 年前

    正在处理 angular 6 Angular HttpClient interceptors ,相似但不相同:

    在我的场景中,没有客户端缓存,服务器会立即返回数据,尽管是陈旧的,但是客户端需要更新,即使是陈旧的数据,在收到陈旧的数据时,会再次调用服务器,这次设置 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 回复  |  直到 6 年前
        1
  •  0
  •   Maksim Romanenko    6 年前

    像这样的?

    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)) */;
    })));
    
    推荐文章