RxJS マップ演算子からエラーをスローする方法 (角度) 質問する

RxJS マップ演算子からエラーをスローする方法 (角度) 質問する

私は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 を返した場合でも、通知として渡されます。errormap()map()next

最後に、おそらく.catchError()(RxJS 5 では旧式catch()) を使用する必要はありません。エラーが発生したときに何らかの副作用を実行する必要がある場合は、たとえばtap(null, err => console.log(err))(RxJS 5 では旧式) を使用する方が適切です。do()

2019年1月: RxJS 6 に更新

おすすめ記事