1. ホーム
  2. angular

[解決済み] RxJSのmap演算子でエラーを出す方法 (angular)

2022-05-17 09:32:10

質問

私の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 というエラーを出したいのです。私のサブスクリプションでは、2番目のパラメータ( handleError ) に入るようにします。

.subscribe(success, handleError)

何か提案はありますか?

どのように解決するのですか?

エラーは 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() はObservableであり、単に error を送るだけですが map() は何を返すかは気にしません。からObservableを返したとしても map() として渡されます。 next として渡されます。

最後になりますが、おそらくあなたは .catchError() (以前の catch() であった)。エラー発生時に何らかの副作用を発生させる必要がある場合は tap(null, err => console.log(err)) (を使うのが良いでしょう(以前は do() はRxJS 5のもの)を例とします。

2019年1月:RxJS 6用に更新しました。