2017-07-07 1 views
0
for (let i = 0; i < this.data.VirtualHosts.length; i++) { 
       // get the vh 
       this.apiService.findVH(this.data.VirtualHosts[i]) 
        // then add each vhost to data by concat and then convert to json 
        .subscribe((data) => { 
         this.data = data.docs[0] 
         this.jsonData = this.jsonData.concat(this.data) 
         //console.log("AFTER: " + this.jsonData[i]._id) 
         //console.log("Response for getVH: " + JSON.stringify(this.jsonData)) 

        }) 
      } 

Ici, je boucle à travers une liste d'identifiants de VirtualHosts et faire un appel get (findVH) sur chacun d'entre eux. Cependant, l'appel de get semble appeler chaque index dans le désordre. Comment ferais-je en sorte que l'appel get renvoie une liste de données dans l'ordre indiqué dans la liste this.data.VirtualHosts?angular2- Observable obtenir des données de la liste sur l'ordre

Répondre

0

Je pense que vous devrez faire 2 choses. Un convertir vos this.data.VirtualHosts en une observable en utilisant l'opérateur de tel que décrit ici:

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/from.md

Ensuite, utilisez concatMap qui forcera les résultats api pour revenir dans l'ordre que vous tiriez au large des demandes. Ceci est expliqué ici:

https://www.learnrxjs.io/operators/transformation/concatmap.html

+0

Oui, j'ai suivi ce que vous avez dit et cela a fonctionné! Merci. – joshua1991

0

Je ne recommanderais pas d'utiliser une observable dans une boucle à moins que vous ne deviez vraiment .. considérer obtenir toutes vos données dans un appel api/observable. Si vous ne vous désinscrivez pas de chacune des observables, vous vous retrouverez avec une fuite de mémoire (sauf si vous utilisez HTTP angulaire).

Quoi qu'il en soit, essayez envelopper votre code avec un délai d'attente pour l'ajouter à la file d'attente:

for (let i = 0; i < this.data.VirtualHosts.length; i++) { 
setTimeout(() => { 
       // get the vh 
       this.apiService.findVH(this.data.VirtualHosts[i]) 
        // then add each vhost to data by concat and then convert to json 
        .subscribe((data) => { 
         this.data = data.docs[0] 
         this.jsonData = this.jsonData.concat(this.data) 
         //console.log("AFTER: " + this.jsonData[i]._id) 
         //console.log("Response for getVH: " + JSON.stringify(this.jsonData)) 

        }) 
}, 0); 
      } 

Actuellement, la boucle pour les extrémités avant votre méthode de service est exeucuted.

+0

Merci pour votre réponse. L'utilisation de ce code me donne une erreur et indique que la propriété de this.apiService.findVH est indéfinie. – joshua1991

+0

Essayez le code mis à jour – TheUnreal

+0

Encore des spectacles hors service :( – joshua1991

0

Les valeurs de retour sont dans un ordre incorrect principalement en raison du fait que Observables va créer un thread distinct par appel, donc la boucle se termine avant que le résultat n'arrive; C'est pourquoi la liste non ordonnée. Ce que j'ai fait dans ce genre de situation est de mettre cela dans une méthode, stocker la liste non ordonnée puis filtrer le résultat vers une autre variable en exécutant une méthode comme find ou filter pour utiliser la valeur commune de this.data.virtualHosts et le résultat non ordonné pour les mettre retour à l'ordre