我在RxJS中遇到过两种类型的错误处理:
onError
subscribe
)
catch
运算符。他们之间有什么区别?有哪些教科书示例或使用其中任何一个的拇指规则?
this.stream$.subscribe(callback, err => console.error(err))
// vs
this.stream$.catch(err => console.error(err)).subscribe(callback)
答案 0 :(得分:2)
在您的示例中,您将在两种情况下获得相同的输出。至于经验法则:
do
。例如,如果您将某个库(例如angular Http
库)包装在添加日志记录的通用包装器中(可能会在发生错误时弹出屏幕底部的吐司),则可以执行此操作。 / LI>
subscribe
。保持Http
示例,如果你想启动一个请求并显示在你要放置响应的同一个地方出现的任何错误,这可能就是这样。catch
。例如,您可能希望捕获401错误,刷新登录凭据,然后重试该请求。在您的示例中,由于您只记录错误,因此catch
不合适。
答案 1 :(得分:1)
subscribe
上的回调位于链的末尾,您只需侦听结果即可。
catch
是一个运算符,可让您在引发错误时更改可观察对象的行为,或仅将错误替换为另一个值。 catch
希望您有所作为,返回一个新的可观察对象,而不仅仅是听它。
此外,您可以在链中使用do
来监听可观察对象,就像在订阅时一样。
*对于RxJs 6 *
使用tap
代替do
。
使用catchError
代替catch
。
使用finalize
代替finally
对于上述所有参数,您需要使用管道:
this.service.getItem()
.pipe(
map((data) => this.onSuccess(data)),
catchError(error => of(this.handleError(error))),
finalize(() => this.stopLoading())
)
.subscribe();
此外,进口也发生了变化。现在,您应该这样导入:
Import { tap, catchError } from 'rxjs/operators';
此外,您不需要导入管道。