Comment puis-je modifier l'ordre d'exécution? J'ai un tableau les messages de la console sont affichés dans l'ordre inverse, Comment puis-je modifier la commande, une fois qu'il est complet, je veux utiliser la fonction de filtrage p> p> this.fr.fr code>, j'ai besoin de travailler avec ce tableau, mais il faut remplir avec les données
3 Réponses :
Il n'est pas nécessaire de mélanger des promesses avec des observables. En outre, il n'est pas une bonne idée de nier Tout d'abord, nous utilisons Mergemap Pour mapper sur les valeurs observables de la méthode GetUserers () à partir du service, dans un interne observable. p> Ensuite, nous utilisons FORKJOIN Pour attendre le tableau dernier mais non le moindre, nous gérons le filtrage du abonner () code> méthodes les unes des autres. Je vous recommanderais de gérer l'opération ci-dessus avec les opérateurs RXJS.
Array.Foreach () Code> Boucle à compléter avant de renvoyer tous les observables. Puisque vous semblez familiariser avec l'utilisation des promesses en JavaScript, il est similaire à
promess.all code>. P>
Listausers code> au
S'abonner () Code> Block. Cela garantira que votre code asynchrone est correctement manipulé. P>
this.listUserService.getUsers().pipe(
mergeMap(data => {
this.listUsers = data;
const observablesList = [];
data.forEach((current: any) => {
if (current.name === userSession) {
observablesList.push(this.friendsService.getFriends(current.id));
}
});
return forkJoin(observablesList);
})
).subscribe(response => {
// console.log(response) will give you the returned values from the looped getFriends()
// handle the rest here
});
Vous pouvez essayer à la place des opérateurs RXJS tels que Switchmap , map et appuyez sur pour contrôler le flux de l'observable, y compris les effets secondaires d'exécution tels que les propriétés de la classe de réglage.
Cette réponse suppose qu'il n'y a qu'un seul utilisateur actuel résultant de if (actuel.name === usersession) { code> à l'intérieur du foreach () et ensuite que
this.friendsservice.gefriends (user.id) code> n'exécute qu'une seule fois.
import { map, switchMap, tap } from 'rxjs/operators'; // need to import operators
// ...
this.listUserService.getUsers().pipe(
tap(users => this.listUsers = users), // side effect to set this.listUsers
map(users => users.find(user => user.name === userSession)), // find current user
switchMap(user => this.friendsService.getFriends(user.id)), // get friends of current user
tap(friends => this.friends = friends), // side effect to set this.friends
map(friends => this.listUsers.filter(user => this.friends.some(relationship => relationship[0].friend.id !== user.id)))
).subscribe(listUsers => {
this.listUsers = listUsers;
});
C'est parce que vous utilisez des flux rxjs dans le mauvais sens. Vous configurez votre flux d'abord, de sorte que tout autre la voie RXJS serait à Ce n'est pas tant de problème angulaire, c'est plus rxjs liée. Voici un exemple de ce qu'il pourrait ressembler à: p> Le commutateur code> passe à un autre sous-marin observable, de sorte que vous n'avez pas besoin de deux abonnements. Ceci est considéré comme une bonne pratique! P> Je recommanderais vivement de passer du temps à apprendre des rxjs, il fera de vos expériences de manière angulaire beaucoup plus agréable et productive! P> Je peux vous aider avec cela si vous le souhaitez! p> p> console.log code> fonctionnerait en premier. Le flux Rx est asynchronisé par lui-même, de sorte que vous n'avez pas besoin
async attendre code>. L'autre
console.log code> sera exécuté lorsque le flux est appelé en réalité et reçoit des données.
.pipe () code> Votre
filtre ( ) code> à l'intérieur du flux RX. P>