gpt4 book ai didi

angular - 如何从 RxJS 映射运算符( Angular )抛出错误

转载 作者:太空狗 更新时间:2023-10-29 16:46:23 24 4
gpt4 key购买 nike

我想根据条件从我的可观察对象的 ma​​p 运算符中抛出错误。例如,如果未收到正确的 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)

有什么建议吗?

最佳答案

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

这意味着你不会返回任何东西,只会抛出错误:

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

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

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

2019 年 1 月:针对 RxJS 6 进行了更新

关于angular - 如何从 RxJS 映射运算符( Angular )抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43199642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com