簡體   English   中英

AngularJS / rxjs:訂閱時觀察不到錯誤

[英]AngularJS / rxjs: Observable not catching error at subscription

我試圖處理 Observable 上的一些自定義錯誤。

如果我拋出一個新的自定義錯誤,我想退出訂閱。 但是無論我嘗試什么,它仍然會繼續該過程而不會引發任何錯誤。

我試圖退出訂閱 function 並跳到錯誤處理程序,但我的以下代碼沒有按預期工作..

const obs = new Observable((observer) => {
      observer.next();
    }).pipe(
      map(() => {
        return "Some Data";
      }),
      tap(() => {
        if (true) { // Some condition
          return throwError( new Error("Test error") )
        }
      }),
      catchError(() => {
        return throwError( new Error("Test error") );
      })
    )

    obs.subscribe((res) => {
      console.log("[OBS]", res); // Actual triggered handler
    }, err => {
      console.log("[OBS]", err); // This handler should be actually triggered
    })

Tap 操作符中的返回值沒有效果,在后續操作中可觀察的 stream 不會使用它。 如果您使用 map 而不是點擊,您應該會看到錯誤消息。

@Loop 的答案是正確的,但是您可以將iif運算符與mergeMap map

如果:

在訂閱時決定實際訂閱哪個 Observable。

iif 接受條件 function 和兩個 Observable。 當操作者返回的 Observable 被訂閱時,條件 function 將被調用。 根據當時返回的 boolean ,消費者將訂閱第一個 Observable(如果條件為真)或第二個(如果條件為假)。 條件 function 也可能不返回任何內容 - 在這種情況下,條件將被評估為 false 並且第二個 Observable 將被訂閱。

所以你可以嘗試這樣的事情:

   const MyCustomError1 = throwError(new Error("Test error 1"));
   const MyCustomError2 = throwError(new Error("Test error 2"));

    const obs = new Observable(observer => {
      observer.next();
    }).pipe(
      map(() => {
        return "Some Data";
      }),
      mergeMap(v =>
        iif(
          () => /** Condition goes here **/ true,
          /** if true **/ MyCustomError1,
          /** if false **/ of(v)
        )
      ),
      catchError(() => {
        console.log("Error catched");
        return MyCustomError2;
      })
    );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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