我想根据条件从我的 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 许可协议
只需在
map()
运算符中抛出错误。 RxJS 中的所有回调都用 try-catch 块包装,因此它会被捕获,然后作为error
通知发送。这意味着您不返回任何内容而只是抛出错误:
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 更新