私はObservableからエラーをスローしたい地図条件に基づく演算子。たとえば、正しい 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
以下で説明する 2 番目のパラメーター ( ) に入ります。
.subscribe(success, handleError)
助言がありますか?
ベストアンサー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()
(RxJS 5 では前者)は、通知を送信するだけで、返される内容は考慮しないObservable.throw()
Observable です。Observable を返した場合でも、通知として渡されます。error
map()
map()
next
最後に、おそらく.catchError()
(RxJS 5 では旧式catch()
) を使用する必要はありません。エラーが発生したときに何らかの副作用を実行する必要がある場合は、たとえばtap(null, err => console.log(err))
(RxJS 5 では旧式) を使用する方が適切です。do()
2019年1月: RxJS 6 に更新