亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何確保在 HTTP 攔截器之后發生在 observable 上的操作符?

如何確保在 HTTP 攔截器之后發生在 observable 上的操作符?

一只斗牛犬 2022-01-13 16:21:03
在我的 Angular 8 應用程序中,我有一個基本的緩存攔截器:export class CacheInterceptor implements HttpInterceptor {  constructor(private cache: CacheService) {}  public intercept(    req: HttpRequest<any>,    next: HttpHandler  ): Observable<HttpEvent<any>> {    if (req.method !== 'GET') {      return next.handle(req);    }    const cachedResponse = this.cache.get(req);    if (cachedResponse) {      console.log(cachedResponse);      return of(cachedResponse);    }    return next.handle(req).pipe(      filter(event => event instanceof HttpResponse),      map((response: HttpResponse<any>) => {        this.cache.addToCache(req, response);        return response;      })    );  }}我還有一個從外部 API 檢索數據的服務:  public getCases(options: ModuleArguments): Observable<CaseResponse> {    return this.http      .get<CaseResponse>(this.URL_BASE, {        params: options as HttpParams      })      .pipe(map(this.cleanData, this));  }'cleanData' 方法只是循環接收到的數據并修改一些值以使它們更人性化(例如將'support_request' 變為'Support Request')。似乎正在發生的事情是在服務中“清理”數據后,CacheInterceptor 將響應添加到緩存中。因此,當再次發出相同的請求并從緩存中接收到時,服務正在嘗試清理已被清理的數據。如何確保 HTTP 響應在被服務修改之前已被攔截并添加到緩存中?
查看完整描述

1 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

你如何通過將pipe(map(this.cleanData, this))操作移動到 Observable 完成并返回你的CaseResponse. 很可能,這意味著HttpInterceptor已首先應用。


即在你調用的地方getCases你可以嘗試這樣的事情:


service.getCases(options).subscribe(resolvedData => {

   // assuming cleanData(data: CaseResponse) signature

   const cleanedData = this.cleanData(resolvedData);  


   // .. do something with cleanedData 

});


此外,從設計的角度來看,您不會想要getCases做的不僅僅是它應該做的事情 - 它是一種服務方法,它執行 HTTP 請求并以它們發送給您的格式返回案例。理想情況下,數據的重新格式化可以在該服務功能的消費者處完成 - 因為它很可能是需要對其進行清理/重塑的消費者。


查看完整回答
反對 回復 2022-01-13
  • 1 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號