[英]RxJs catchError changes return type
我正在嘗試實現一些緩存,並且我有以下方法。 catchError
塊導致錯誤,因為返回類型變為Observable<Client | Client[]>
Observable<Client | Client[]>
。 我不明白為什么它認為它不是一組客戶端,或者如何修復。
#clients: Client[] = []
#clientsLastModified: string | null = null
index(): Observable<Client[]> {
let headers = new HttpHeaders()
if (this.#clientsLastModified)
headers = headers.set('If-Modified-Since', this.#clientsLastModified)
return this.http.get<IClientDTO[]>('clients', {headers, observe: 'response'}).pipe(
map(x => {
this.#clientsLastModified = x.headers.get('Last-Modified')
if (x.status === HttpStatusCode.Ok && x.body) {
this.#clients = x.body.map(x => new Client(x))
return this.#clients
} else
return of([])
}),
catchError((err: unknown) => {
if (err instanceof HttpErrorResponse && err.status === HttpStatusCode.NotModified)
return this.#clients
return throwError(() => err)
})
)
}
為了糾正這個問題,需要做兩個小改動:
不要在 map 內部使用of
您希望 map 的結果返回類型Client[]
; of
使其返回Observable<Client[]>
of
內部catchError
。 在catchError
中,你應該返回 observable,所以of
是必需的。 沒有顯示錯誤的原因是因為類型是 Array,並且 Array 也是有效的ObservableInput
,但會有不同的行為。 RxJS 會將 Array 轉換為單獨發出每個項目的 observable(因此類型最終是Observable<Client>
而不是Observable<Client[]>
)。
return this.http.get<IClientDTO[]>('clients', {headers, observe: 'response'}).pipe(
map(x => {
this.#clientsLastModified = x.headers.get('Last-Modified')
if (x.status === HttpStatusCode.Ok && x.body) {
this.#clients = x.body.map(x => new Client(x))
return this.#clients
} else
return [] // <-- don't use of
}),
catchError((err: unknown) => {
if (err instanceof HttpErrorResponse && err.status === HttpStatusCode.NotModified)
return of(this.#clients) // <-- use of
return throwError(() => err)
})
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.