Abonnez-vous à plusieurs Observables (comme le chaînage de l'époque() dans les Promesses)
Mon Angulaire 2 application a 2 méthodes (GetCategories()
et GetCartItems()
) dans un service , et que ces deux méthodes retournent Observable
s.
Pour invoquer ces deux méthodes, l'une après l'autre à partir de mes composants, j'ai écrit ci-dessous le code:
ngOnInit()
{
this.appService.GetCategories().subscribe( (data) => {
this.appService.categories = data;
this.appService.GetCartItems().subscribe( {
next: (data) => { this.appService.cart = data},
error: (err) => { this.toaster.error('cart==>' + err)}
})
});
}
Fondamentalement, l'appel de GetCartItems()
de l'intérieur subscribe()
de GetCategories()
, et je crois que ce n'est PAS la bonne approche. C'est une sorte de rappel de l'enfer.
Aucune idée sur comment implémenter cela dans une meilleure façon (comme le chaînage then()
dans Promise
s)?
Vous devez vous connecter pour publier un commentaire.
Ressemble
GetCartItems
doens dépend pas deGetCategories
. Ensuite, vous pouvez utiliser zip:Observable.combineLatest
est le bon choix, pasObservable.zip
(si j'ai bien compris le problème). Les choses ont changé dans l'année depuis que vous avez écrit cela. Lorsque j'utiliseObservable.zip
sans un troisième argument, comme dans le cas ci-dessus, l'une des entrées est pas défini, selon le moment de l'abonnement arrive à feu.Ce qui est le plus généralement fait avec
concat()
,concatMap()
ou éventuellementconcatAll()
en fonction de votre cas d'utilisation et whetrher vous avez besoin d'appeler à la fois des services dans l'ordre ou pas.Cette affiche à la console:
Chaque article est retardé de montrer ces sont appelés dans l'ordre l'un après l'autre.
Si vous n'avez pas besoin de garder la même commande, vous pouvez utiliser
merge()
oumergeMap()
.Voir la démo en live: https://jsbin.com/wawajob/1/edit
Notez que l'utilisation de
zip()
peut avoir un comportement indésirable. Voir https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md