簡體   English   中英

Rxjs concatMap 返回類型到 Observable<boolean>

[英]Rxjs concatMap return type to Observable<boolean>

  1. 我有一項正在回報承諾的服務
  2. 其他是發布數據和返回保存的數據
  3. 保存成功后返回true

所以方法的返回類型應該是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> 事實上,不需要將您的參數輸入為Responseany的聯合類型。 這是您應該如何定義 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM