[解決済み] 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用に更新しました。
関連
-
[解決済み】 node_modules/rxjs/internal/types.d.ts(81,44): エラー TS1005: ';' Angular 6のインストール後に予想されたエラー
-
[解決済み】アンギュラーコンポーネントにサービスを注入しようとするとエラー "EXCEPTION: Can't resolve all parameters for component"、なぜ?
-
[解決済み] Angular/RxJS `Subscription` からいつ退会すればいいのか?
-
[解決済み] Angular 2の "select "で新しい選択範囲を取得するにはどうすればよいですか?
-
[解決済み] Angular HTTP GET with TypeScript エラー http.get(...).map is not a function in [null].
-
[解決済み】Angular 2 beta.17:プロパティ 'map' がタイプ 'Observable<Response>' に存在しない。
-
[解決済み] Angularで、コントロールが作成された後、FormControlにバリデータを追加する方法は?
-
[解決済み] Angular2 bodyタグにクラスを追加する
-
[解決済み] AngularでFormArrayからすべての項目を削除する
-
[解決済み] RxJSのmap演算子でエラーを出す方法 (angular)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ng buildの後にangular-cliのdist-folderのパスを変更するには?
-
[解決済み] Angular 2におけるEventEmitter.next()とEventEmitter.emit()の相違点
-
[解決済み] コンポーネントクラスからテンプレート参照変数にアクセスする
-
[解決済み] Angular / Angular Materialでmat-horizontal-stepperのステップをプログラムで移動させることは可能ですか?
-
[解決済み] Angular v5からAngular v6にプロジェクトをアップグレードしたい。
-
[解決済み] 文字列|ヌル'型の引数は、文字列'型のパラメータに代入できません。タイプ 'null' はタイプ 'string' に割り当てられません。
-
[解決済み] Angular2 bodyタグにクラスを追加する
-
[解決済み] AngularでFormArrayからすべての項目を削除する
-
[解決済み] RxJSのmap演算子でエラーを出す方法 (angular)
-
[解決済み] Karma/Jasmineのテストで「[object ErrorEvent] thrown」エラーが発生した場合、どのようにデバッグすればよいですか?