[英]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.