2017-10-16 4 views
0

J'ai une question à propos de observable. Par exemple, nous avons api, et envoyer un reguest là:Observable - Faire la queue des demandes dynamiques (angulaire 4)

this.http.get('https://swapi.co/api/people/').subscribe(peoplesData => { 
    let peoples = peoplesData.json(); 
    let nextPage = peoples.next; // https://swapi.co/api/people/?page=2 
    this.peoples = peoples.results; 
}); 

Lorsque j'envoie la demande d'abord, je vais obtenir url pour la prochaine requête (dans cet exemple, l'URL contient dans « nextPage »). J'ai besoin de créer une méthode, qui fera toutes les requêtes, et après chaque requête ajoutera tous les 'résultats' à 'this.peoples'. Je pense, .mergeMap et switchMap ne correspondent pas à cela. Peut-être avez-vous plus d'expérience avec Observable? S'il vous plaît aidez-moi avec cette méthode.

Mise à jour J'ai résolu ce problème avec .expand:

return this.http.get('https://swapi.co/api/people/') 
     .expand(peoplesData => { 
     let peoples = peoplesData.json(); 
     if (peoples.next) { 
      return this.http.get(peoples.next); 
     } else { 
      return Observable.empty(); 
     } 
     }) 
     .map(peoples => peoples.json()); 
+0

Pour autant que je peux voir, la seule question ici dans votre post est "avez-vous plus d'expérience avec Observables que je fais?" De plus, les liens sont mauvais parce qu'ils expirent. Modifier vous publiez pour inclure le code lié, plz. –

+1

@TheHeadRush, merci. J'ai édité mon post et ajouté l'exemple. Pourriez-vous m'aider à choisir une méthode observable? –

+0

Jetez un oeil à ceci: https://stackoverflow.com/questions/38712121/angular2-nested-http-requests –

Répondre

0

Ma solution à l'aide rxjs Rx flatMap:

import {Observable} from 'rxjs/Rx'; 


ngOnInit() { 
    const arrayIds = [2456, 12456, 456, 7899]; 
    this.doUsersRequest(arrayIds); 
} 

doUsersRequest(queryArr, previousObservable = null) { 
     if (queryArr.length) { 
      const url = 'api/users/id/' + queryArr.shift(); 
      let observable = null; 
      if (previousObservable) { 
       observable = previousObservable.flatMap(() => { 
        return this.http.get(url); 
       }); 
      } else { 
       observable = this.http.get(url); 
      } 
      return this.doUsersRequest(queryArr, observable); 
     } else { 
      return previousObservable; 
     } 
    }