Angular 6 with Rxjs 6に取り組んでいますが、応答が失敗したか例外がある場合にnull /空のObservableを返すことについて質問があります。これは私の仮定です、私のリモートAPIは、IOptionResponse、のオブジェクトを返します。これには、「SUCCESS」または「FAILED」などのメッセージ文字列が含まれます。 'IOption'オブジェクトの配列であるモデル
export interface IOptionResponse {
message: string;
model: IOption[];
}
これが私のサービスメソッド名ですこれは、リモートAPI結果の「モデル」であるIOption配列のObservableを返します
loadIOptionMembersRelationship(): Observable<IOption[]> {
return this.httpClient.get<IOptionResponse>('${environment.apiUrl}/api/member/XXX')
.map(
(response) => {
console.log(response);
// if response.message is success, return IOption[] model
if (response.message == responseMessage.Success) {
return response.model;
}
else {
// return Observable.empty<IOption[]>(); failed
// return new Observable.empty<IOption[]>(); failed
// return new EmptyObservable<IOption[]>(); failed
// return new Observable<IOption[]>.from([]); failed
// Otherwise return a NULL/EMPTY Observable
//What should be the correct way to implement here???
}
}
);
}
私は投稿を読みました here これは似ていますが、考えられるすべての解決策を試してみましたが機能しません。投稿された解決策が古くなっているためか、何らかの方法が変更されたためかどうかはわかりませんrxjs 6で、または多分それはTypeScriptの問題です...
Rxjs6を使用しているときに空の監視可能配列を返す場合は、次のことを行う必要があります...
import { of } from 'rxjs';
次に、<IOption []>タイプの空のObservable配列を返す場所...
return of<IOption[]>([]);
あなたが言及した投稿のすべての解決策は「次の」コールバックをトリガーせず、ワークフローは機能しません。ただするだけ
return;
ただし、この場合はエラー情報が失われます。私はそれを行うための最良の方法は次のとおりだと思います
throw new Error("Failed to get the model...");
FAILED
の結果を気にしますか?そうしない場合(空のObersavbleを出力したいため、これは真実です)、単純にそれをフィルターに掛けることができます。その後、空のObservableを明示的に発行する必要はありません。
loadIOptionMembersRelationship(): Observable<IOption[]> {
return this.httpClient.get<IOptionResponse>('${environment.apiUrl}/api/member/XXX')
.filter(response => response.message === responseMessage.Success) //only emit those response whose message is SUCCESS
.map(response => response.model);
}
empty
Observableを明示的に返すと、ストリームが終了します。これは、実装に応じて必要な場合とそうでない場合があります。
map()
を使用すると、新しいオブザーバブルがそのソースオブザーバブルに基づいて発行するデータを変換します。あなたの問題は、Observableがempty
型の値を返す必要があるにもかかわらず、IOptionsResponse
Observableを返そうとすることです。したがって、ObservableはコードObservable<IOptionsResponse | Observable<IOptionsResponse>>
に基づいています。 elseでnullまたはundefinedを返すだけです。