web-dev-qa-db-fra.com

Retourne un observable nul / vide dans Angular 6 avec Rxjs 6

Je travaille sur Angular 6 avec Rxjs 6 alors que j'ai une question concernant le retour d'un Observable nul/vide si la réponse a échoué ou a une exception, voici mon hypothèse , mon API distante renverra un objet de IOptionResponse , il contient une chaîne de message qui pourrait être indiquée comme 'SUCCESS 'ou' FAILED ', il contient également un modèle qui est un tableau d'objets' IOption '

export interface IOptionResponse {
    message: string;
    model: IOption[];
}

Voici mon nom de méthode de service, il retournera un tableau Observable of IOption qui est le "modèle" de mon résultat API distant

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???
                }
            }
        );
}

J'ai lu le post ici qui est similaire, mais j'ai essayé toutes les solutions possibles et elles ne fonctionnent pas, je ne sais pas si c'est parce que les solutions publiées sont obsolètes ou peut-être qu'une méthode a changé dans rxjs 6 ou c'est peut-être un problème TypeScript ...

3
KevDing

Si vous souhaitez renvoyer un tableau observable vide lors de l'utilisation de Rxjs6, vous devez ...

import { of } from 'rxjs';

Ensuite, où vous souhaitez retourner votre tableau observable vide de type <IOption []> ...

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

Toutes les solutions du message que vous mentionnez ne déclencheront pas de rappel "suivant" et votre flux de travail ne fonctionnera pas. Faites simplement

return;

Mais dans ce cas, vous perdrez des informations d'erreur. Je pense que la meilleure façon de le faire est de suivre

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

Vous souciez-vous des résultats de FAILED? Si vous ne le faites pas (ce qui est tout à fait vrai puisque vous souhaitez émettre un Obersavble vide), vous pouvez simplement le filtrer. Ensuite, vous n'avez pas besoin d'émettre explicitement un observable vide:

 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);
}

Le retour explicite d'un empty Observable mettra fin au flux, qui peut ou non être ce que vous voulez selon votre implémentation.

1
CozyAzure

Lorsque vous utilisez map() vous transformez les données que le nouvel observable émet en fonction de sa source observable. Le problème que vous avez est que vous essayez de renvoyer un empty observable bien que votre observable doit renvoyer une valeur de type IOptionsResponse. Votre Observable est donc basé sur votre code et un Observable<IOptionsResponse | Observable<IOptionsResponse>>. Vous pouvez simplement retourner null ou undefined dans votre else.

0
SirDieter