AngularJS / rxjs:订阅时观察不到错误
Posted
技术标签:
【中文标题】AngularJS / rxjs:订阅时观察不到错误【英文标题】:AngularJS / rxjs: Observable not catching error at subscription 【发布时间】:2021-06-17 07:54:52 【问题描述】:我正在尝试处理 Observable 上的一些自定义错误。
如果我抛出一个新的自定义错误,我想退出订阅。 但无论我尝试什么,它仍然会继续该过程而不会引发任何错误。
我试图退出订阅函数并跳到错误处理程序,但我的以下代码没有按预期工作..
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
)
【问题讨论】:
【参考方案1】:@Loop 的答案是对的,但你可以使用iif
运算符与mergeMap
组合来代替map
。
iif:
在订阅时决定实际订阅哪个 Observable。
iif 接受一个条件函数和两个 Observable。当操作者返回的 Observable 被订阅时,会调用条件函数。根据当时它返回的布尔值,消费者将订阅第一个 Observable(如果条件为真)或第二个(如果条件为假)。条件函数也可能不返回任何内容 - 在这种情况下,条件将被评估为 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;
)
);
【讨论】:
这很完美!不知道运营商如此依赖错误处理。【参考方案2】:点击操作符中的返回值没有任何作用,它不会被后续操作中的可观察流使用。 如果您使用地图而不是点击,您应该会看到错误消息。
【讨论】:
我也尝试过使用 map 运算符,但它没有跳转到错误处理程序...它停留在订阅函数中..以上是关于AngularJS / rxjs:订阅时观察不到错误的主要内容,如果未能解决你的问题,请参考以下文章
Angular RxJS入门笔记 (Observable可观察对象Subscribe订阅Observer观察者Subscription对象)