Observable.throw与subscribe错误回调的差异及两段RxJS代码区别
Observable.throw 与 subscribe 错误回调的差异及两段RxJS代码对比
先掰扯清楚这俩核心概念的区别:
- Observable.throw:它就像个「错误传递员」,用来创建一个立刻抛出错误的Observable。通常在操作符链(比如
catch这类中间处理环节)里,把捕获到的错误重新扔回流中,让后续的操作或订阅者去处理——它本身不处理错误,只负责传递。 - subscribe 的 error 回调:这是整个Observable流的「终点站错误处理员」。当流里出现错误时,最后会走到这里,它负责把错误彻底处理掉(比如弹提示、记日志),默认情况下不会再把错误传递出去,相当于给错误画上句号。
接下来看看两段代码的具体处理差异:
第一段代码
this.ApiService.getList().catch((e, c) => { return Observable.throw(e); }) .subscribe(() => {})
这段代码的操作逻辑:
- 调用
getList()发起请求,若出现错误会被catch操作符捕获; - 但
catch并没有真正处理错误,而是用Observable.throw(e)把错误重新抛回了流里; - 最后
subscribe只写了成功回调,没写错误回调——这下就麻烦了,重新抛出的错误没人接,会变成未捕获错误,在Angular这类框架里可能触发全局错误处理器,甚至导致程序报错中断。
简单说,这段代码相当于「接了个错误,转手又扔了,但没人捡」,和直接调用getList().subscribe()(不处理错误)的结果几乎一样,只是多了一次错误传递的过程。
第二段代码
this.ApiService.getList().subscribe(() => {}, error => {notifyService.showError(error._body); })
这段代码的逻辑就清晰多了:
- 调用
getList()发起请求,一旦出现错误,直接进入subscribe的错误回调; - 在回调里调用
notifyService.showError()把错误内容展示给用户,错误在这里被终端处理; - 整个流的错误到此为止,不会再向上冒泡,也不会产生未捕获错误的问题。
内容的提问来源于stack exchange,提问作者Tamer Hussien
相关产品推荐
相关产品推荐

