如何从 RxJS 映射运算符中抛出错误(角度)

新手上路,请多包涵

我想根据条件从我的 observable 的 map 运算符中抛出一个错误。例如,如果没有收到正确的 API 数据。请看以下代码:

 private userAuthenticate( email: string, password: string ) {
    return this.httpPost(`${this.baseApiUrl}/auth?format=json&provider=login`, {userName: email, password: password})
        .map( res => {
            if ( res.bearerToken ) {
                return this.saveJwt(res.bearerToken);
            } else {
                // THIS DOESN'T THROW ERROR --------------------
                return Observable.throw('Valid token not returned');
            }
        })
        .catch( err => Observable.throw(this.logError(err) )
        .finally( () => console.log("Authentication done.") );
}

基本上正如您在代码中看到的那样,如果响应( res 对象)没有 bearerToken 我想抛出一个错误。所以在我的订阅中,它进入了下面提到的第二个参数( handleError )。

 .subscribe(success, handleError)

有什么建议么?

原文由 Hassan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 390
1 个回答

只需在 map() 运算符中抛出错误。 RxJS 中的所有回调都用 try-catch 块包装,因此它会被捕获,然后作为 error 通知发送。

这意味着您不返回任何内容而只是抛出错误:

 map(res => {
  if (res.bearerToken) {
    return this.saveJwt(res.bearerToken);
  } else {
    throw new Error('Valid token not returned');
  }
})

throwError() (前 Observable.throw() 在 RxJS 5 中)是一个 Observable,它只发送一个 error 通知但 map() 返回。即使您从 map() 返回 Observable,它也会作为 next 通知传递。

最后一件事,您可能不需要使用 .catchError() (在 RxJS 5 中以前是 catch() )。如果您需要在发生错误时执行任何副作用,最好使用 tap(null, err => console.log(err)) (在 RxJS 5 中的前 do() )。

2019 年 1 月:针对 RxJS 6 更新

原文由 martin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进