cdSo Angular 5コードの一部を6に移行しようとしていますが、.pipe()演算子を使用してrxjsが機能するために必要な変更のほとんどを理解しています。'pipable'操作で期待するとおりに機能します。
ただし、の動作は演算子とcatchError()
は異なり.catch()
ます。rxjs 6より前は、.catch()
演算子を使用してエラー入力を一貫性のあるエラーオブジェクトに変換し、それを `.subscribe()でキャッチできました。
getAlbums(): Observable<Album[]> {
return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
.map(albumList => this.albumList = albumList)
.catch(new ErrorInfo().parseObservableResponseError);
}
new ErrorInfo().parseObservableResponseError
エラーオブジェクトを入力として受け取り、入力エラーを正規化されたオブジェクトを使用してより単純なエラーオブジェクトに解析する関数です。キャッチリターンObservable<any>
:
parseObservableResponseError(response): Observable<any> {
let err = new ErrorInfo();
...
return Observable.throw(err);
}
これは、rxjs5までのエラーを簡単に処理するのに最適です。エラーは基本的にパイプラインの一部としてキャプチャされ、.subscribe()
エラー関数でキャプチャできる既知のエラー構造をスローします。
ただし、同じコードをrxjs 6に移動し、使用.pipe()
して次のことを実行しようとしています。
getAlbums(): Observable<Album[]> {
return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
.pipe(
map(albumList => this.albumList = albumList),
catchError(new ErrorInfo().parseObservableResponseError)
);
}
ただし、catchErrorが結果をObservable<any>
パイプラインに返すようになったため、これは機能しません。これは、ここで必要なことではありません。本質的には、以前と同じようにエラーを再スローしたいだけです。
エラーTS2322:タイプ 'Observable <{} | Album []> 'はタイプ' Observable 'に割り当てることができません
古いオペレーターの.catch()
動作をどのようにシミュレートしますか?
更新:
これをもう少しいじった後、示されているコードはビルドエラーを出さずに動作を開始しました。正直なところ、以前はエラーメッセージで失敗した理由がわかりませんが、現在は機能しています。コメント内の@cartantによる提案は、結果を指定する明示的な方法であり、それも機能します。
タイプパラメータを明示的に指定してcatchError
、値を発行するオブザーバブルを返さないこと、つまり、返すことを示し、Observable<never>
常に次をスローできるようにする必要があります。
getAlbums(): Observable<Album[]> {
return this.httpClient.get<Album[]>(this.config.urls.url("albums"))
.pipe(
map(albumList => this.albumList = albumList),
catchError<Album[], never>(new ErrorInfo().parseObservableResponseError)
);
}
そうすることで、pipe
呼び出しから推測されたタイプがであることがわかりますObservable<Album[]>
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加