web-dev-qa-db-ja.com

Rxjs 6でAngular 6にnull /空のObservableを返す

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の問題です...

3
KevDing

Rxjs6を使用しているときに空の監視可能配列を返す場合は、次のことを行う必要があります...

import { of } from 'rxjs';

次に、<IOption []>タイプの空のObservable配列を返す場所...

return of<IOption[]>([]);
6

あなたが言及した投稿のすべての解決策は「次の」コールバックをトリガーせず、ワークフローは機能しません。ただするだけ

return;

ただし、この場合はエラー情報が失われます。私はそれを行うための最良の方法は次のとおりだと思います

throw new Error("Failed to get the model...");
1
Mihail

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を明示的に返すと、ストリームが終了します。これは、実装に応じて必要な場合とそうでない場合があります。

1
CozyAzure

map()を使用すると、新しいオブザーバブルがそのソースオブザーバブルに基づいて発行するデータを変換します。あなたの問題は、Observableがempty型の値を返す必要があるにもかかわらず、IOptionsResponse Observableを返そうとすることです。したがって、ObservableはコードObservable<IOptionsResponse | Observable<IOptionsResponse>>に基づいています。 elseでnullまたはundefinedを返すだけです。

0
SirDieter