0
votes

Comment puis-je changer l'ordre dans Abonnez-vous?

Comment puis-je modifier l'ordre d'exécution? J'ai un tableau this.fr.fr , j'ai besoin de travailler avec ce tableau, mais il faut remplir avec les données xxx

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


0 commentaires

3 Réponses :


2
votes

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 abonner () code> méthodes les unes des autres. Je vous recommanderais de gérer l'opération ci-dessus avec les opérateurs RXJS.

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 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>

dernier mais non le moindre, nous gérons le filtrage du 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

});


0 commentaires

1
votes

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;
});


0 commentaires

1
votes

C'est parce que vous utilisez des flux rxjs dans le mauvais sens. Vous configurez votre flux d'abord, de sorte que tout autre console.log fonctionnerait en premier. Le flux Rx est asynchronisé par lui-même, de sorte que vous n'avez pas besoin async attendre . L'autre console.log sera exécuté lorsque le flux est appelé en réalité et reçoit des données.

la voie RXJS serait à .pipe () Votre filtre ( ) à l'intérieur du flux RX.

Ce n'est pas tant de problème angulaire, c'est plus rxjs liée. Voici un exemple de ce qu'il pourrait ressembler à: xxx

Le commutateur 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!

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!

Je peux vous aider avec cela si vous le souhaitez!


0 commentaires