![](/img/trans.png)
[英]RxJS concatMap subscription is called for second Observable separately
[英]Rxjs concatMap return type to Observable<boolean>
所以方法的返回類型應該是Observable<boolean>
而不是Observable<any>
,這是代碼
// I want it's return type to be Observable<boolean>
saveUser(record: any): Observable<any> {
return from(this.getUserById(1))
.pipe(concatMap((data: any) => {
// Some other code....
return this.httpClient.post(`${this.API_URL}/users`, record)
.pipe(
map((result: any) => {
console.log(result);
return true;
}),
catchError(error => this.handleError(error))
)
}));
}
我想要,它的返回類型是Observable<boolean>
但是當我更改為 Observable 時,立即開始出錯。
請參閱StackBlitz上的 workin 示例代碼
注意:除了
saveUser(record: any)
之外,我無法更改任何其他方法!
問題在於您的catchError
函數。
如果拋出,則沒有返回類型,函數不會返回。
您可以處理錯誤並返回一個 observable:
private handleError(error: Response | any): Observable<boolean> {
return of(false);
}
這是處理您的方法的正確方法:
首先,正如 文檔中提到的, throwError
返回Observable<never>
。 事實上,不需要將您的參數輸入為Response
或any
的聯合類型。 這是您應該如何定義 handleError 方法(而不是將返回類型設置為any
):
private handleError(error: Response): Observable<never> {
return throwError(error);
}
然后,在您的saveUser
方法中,它可以返回一個boolean
類型的 observable ,或者never
。 因此,返回類型應該是Observable<boolean | never>
Observable<boolean | never>
saveUser(record: any): Observable<boolean | never> {
return from(this.getUserById(1))
.pipe(concatMap((data: any) => {
return this.httpClient.post(`${this.API_URL}/users`, record)
.pipe(
map((result: any) => {
console.log(result);
return true;
}),
catchError(error => this.handleError(error))
)
}));
}
這是工作演示,沒有任何 TypeScript 錯誤。
我說這只是一個 linting 問題是否正確?
你說你只能改變 saveUser,所以我假設你不能改變 handleError 來返回Observable<boolean>
以滿足你的目的。
相反,您可以通過重新聲明您正在調用的其他函數的類型版本來強制打字稿行為:
saveUser(record: any): Observable<boolean> {
const _catchError: OperatorFunction<any, boolean> = catchError(error => this.handleError(error));
return from(this.getUserById(1))
.pipe(concatMap((data: any) => {
return this.httpClient.post(`${this.API_URL}/users`, record)
.pipe(
map((result: any): boolean => {
console.log(result);
return true;
}),
_catchError
)
}));
}
編輯:工作演示: https : //stackblitz.com/edit/angular-s4zw4q
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.