RxJS Observables retour tableau, exécuter une autre fonction avec chaque matrice d'itération
J'ai une fonction getNews()
, ce qui en gros revient angulaire du http.requête get. Résultat de la demande est la matrice d'identité. Je voudrais parcourir ce tableau, j'ai lancer une autre adresse http.requête get (fonction getItem(id)
), qui sera ensuite de retour unique Id de l'objet, reçue du serveur.
J'ai essayé de l'utiliser comme ceci:
getLatest() {
return this.http.get('all_news_url')
.map(res => res.json())
//I even tried creating Observable from array and get only 5 elements
//.map(res => Observable.from(res.json()))
//.take(5)
.map((data) => this.getItem(data))
.subscribe(
data => {
console.log(data);
}
)
}
getItem(itemId: any): Observable<any> {
console.log('item id', itemId);
return this.http.get(this.generateUrl(`item/${itemId}`))
.map(res => res.json());
}
Évidemment, cela ne fonctionne pas. paramètre getItem()
fonction obtient toujours passé comme tout le tableau des Id.
Merci à vous tous pour votre participation à cette question.
OriginalL'auteur gregor | 2016-06-23
Vous devez vous connecter pour publier un commentaire.
Vous voudrez probablement utiliser la concatMap opérateur au lieu de la carte. concatMap aplatit le retour des Observables à la source Observables, tandis que la carte renvoie une observable de l'observable.
Si vous souhaitez que les données de getItem() pour être dans le même ordre répertoriées dans la all_news_url", vous pouvez essayer quelque chose comme
Avec le code ci-dessus, les appels à getItem() sera synchrone, j'.e il n'y aura qu'une seule demande d'élément/${itemId} " à un moment, et afin
Si vous n'avez pas de soins sur l'ordre et le souhaitez, de les accélérer par l'envoi de plusieurs demandes à la fois, de modifier le deuxième concatMap à mergeMap. Notez que les demandes (le point/itemId) sera toujours dans l'ordre, mais il n'y a pas de garantie sur les réponses de la commande. Vous pouvez fournir le maximum de demandes simultanées que le troisième paramètre mergeMap (en ignorant le deuxième paramètre en passant pas défini ou null).
passant 1 en tant que troisième paramètre de mergeMap serait équivalent à concatMap
.map(res => res.json())
. Je vous remercie beaucoup.Vous avez raison @gregor. J'ai copié et collé sans avoir à payer beaucoup d'attention 😉
OriginalL'auteur Can Nguyen