我遇到了 RxJS 中的两种错误处理方式:
- 使用
subscribe
的第二个参数 (onError
) - 使用
catch
操作符。
它们之间有何区别?有哪些使用它们的经典例子或规则?
this.stream$.subscribe(callback, err => console.error(err))
// vs
this.stream$.catch(err => console.error(err)).subscribe(callback)
我遇到了 RxJS 中的两种错误处理方式:
subscribe
的第二个参数 (onError
)catch
操作符。它们之间有何区别?有哪些使用它们的经典例子或规则?
this.stream$.subscribe(callback, err => console.error(err))
// vs
this.stream$.catch(err => console.error(err)).subscribe(callback)
do
。例如,如果你正在将某个库(例如Angular的Http
库)包装在通用包装器中,并添加了日志记录功能(例如当出现错误时弹出屏幕底部的消息提示),那么可以使用do
。subscribe
。继续以Http
为例,如果你想要发起一个请求,并在同一位置显示任何出现的错误和响应,则可以使用subscribe
。catch
。例如,也许你想要捕获401错误、刷新登录凭据,然后重试请求。catch
是不合适的。subscribe
方法的回调函数是整个链条的末端,你只需监听结果。
catch
是一个操作符,当抛出错误或仅替换错误为其他值时,它允许您更改可观察对象的行为。 catch
期望你做一些事情,返回一个新的可观察对象而不仅仅是监听它。
此外,你可以在链中使用 do
来像在 subscribe
中一样监听可观察对象。
* 对于 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';
此外,您无需导入管道。
。
catch
操作符的选择器函数返回一个可观察对象,用于继续链式操作。但是对于传递给subscribe
的错误处理程序没有类似的行为。 - cartant