web-dev-qa-db-fra.com

Angular 4 Comment retourner correctement un observable vide

Dans mon Angular 4 application, j’ai une méthode qui doit renvoyer une observable, cette méthode a 3 conditions, les première et deuxième conditions font un appel à get, mais les troisième conditions ne doivent rien faire et Dans ce cas, je dois aussi renvoyer une observable car cette méthode est la première partie d’un opérateur .flatmap. Il est donc nécessaire d’observer une observable de la première partie pour enchaîner la deuxième partie du flatmap.

J'essaie avec: return new Observable<void>(); mais j'ai cette erreur:

ERREUR TypeError: Impossible de lire la propriété 'subscribe' de non définie

C'est la méthode initiale qui doit appeler un service pour charger les données.

loadModelData() {
      this.customerService.getModelDetail(this.code)
        .subscribe(response => {
          this.selected = response.body as Customer;
        });
    }
  }

C'est la méthode de service qui doit chaîner 2 appels.

getModelDetail(code) {

    const params = new HttpParams().set('projection', 'withBalance');

    return this.endPointUrlService.loadMaps(this.entityLink)

      .flatMap((res) => {
        return this.http.get(this.endPointUrlService.cutLinks(
          this.endPointUrlService.map.get('customers')) + '/' + code, {observe: 'response', params: params})
          .map((response) => <any>response);
      })
  }

Et ce sont les méthodes d'un service de support appelé endPointUrlService, checkIfMapIsReady () est la méthode qui doit retourner un vide observable dans le troisième cas.

  loadMaps(entityLink: EntityLink[]): Observable<void> {
    console.log(entityLink);

    for (const i in entityLink) {
      if (entityLink.hasOwnProperty(i)) {
      return this.checkIfMapIsReady(entityLink[i].name, entityLink[i].searchMap, entityLink[i].endPoints[0])
      }
    }
  }


  public checkIfMapIsReady(modelName: string, mapName: string, endPoints: string) {

    if (this.map.get(modelName) === undefined) {
      console.log('endpoint url service All maps undefined ' + modelName);
      return this.getLinks(modelName, this.mapNames.get(mapName), false)
    } else {
      console.log('endpoint url service Populate only ' + mapName);
      if (this.mapNames.get(mapName).get(endPoints) === undefined) {
      return  this.getLinks(modelName, this.mapNames.get(mapName), true)
      } else {
        return new Observable<void>();
      }
    }
  }
17
Alessandro

Une observable qui correspond au type Observable<void> Est

Observable.of();

Il en résulte une observation complète sans valeur et est similaire à Observable.empty().

Tandis que

new Observable<void>();

est incorrect car il manque l'argument de la fonction subscribe. Cela pourrait être à la place:

new Observable<void>(observer => observer.complete());
5
Estus Flask

Peut-être que Observable.empty() est une meilleure option, car il n'émet aucune valeur, les opérateurs en aval ne peuvent pas avoir de problème avec ce qu'il retourne!

Remarque: flatMap(res => ...) et subscribe() en aval ne se déclenchent pas.
Puisque vous n’utilisez pas res, je suppose que c’est l’effet souhaité?

Pour faire bonne mesure, indiquez le type de retour Observable<any>.

Je pense Ce qui suit est logiquement équivalent au posté checkIfMapIsReady(),

public checkIfMapIsReady(modelName: string, mapName: string, endPoints: string) {

  const map = this.map.get(modelName);
  const name = this.mapNames.get(mapName);
  const endPointCheck = name ? name.get(endPoints) : null;

  const links = !endPointCheck 
    ? this.getLinks(modelName, name, !!map)     // !! gives boolean true or false
    : Observable.empty();

  const msg = !map 
    ? 'endpoint url service All maps undefined ' + modelName
    : 'endpoint url service Populate only ' + mapName
  console.log(msg);    

  return links;
);
3
Richard Matsen

vous pouvez utiliser des observables de comportement. ils ont une valeur initiale et lorsque vous vous y abonnez, l'abonnement fonctionne sur cette valeur initiale. alors disons que vous voulez opérer sur une nouvelle instance de Client si la troisième condition était vraie, alors procédez comme suit:

`

let customer = new Customer();
let subj = new BehaviorSubject<Customer>(customer);
....
if(thirdcondition){
  return subj;
}

`

alors maintenant, lorsque vous appelez subscribe () sur cette méthode et que le dernier bloc est exécuté, vous avez ce que vous vouliez. vous pouvez remplacer new customer() par tout ce que vous voulez par défaut.

0
Fatemeh Majd