subscribe和catch运算符中的onError有什么区别?

时间:2017-08-29 22:19:56

标签: javascript rxjs

我在RxJS中遇到过两种类型的错误处理:

  • 使用onError
  • 中的第二个参数(subscribe
  • 使用catch运算符。

他们之间有什么区别?有哪些教科书示例或使用其中任何一个的拇指规则?

this.stream$.subscribe(callback, err => console.error(err))

// vs

this.stream$.catch(err => console.error(err)).subscribe(callback)

2 个答案:

答案 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';

此外,您不需要导入管道。