0
votes

Comment utiliser ASYNC Appeler à l'intérieur de Foreach lors de l'utilisation des appels de FireBase

La question que j'ai est que je ne puisse pas comprendre comment rendre ce code fonctionner correctement à l'aide de FireStore (pas sûr si cela n'est pas pertinent).

Le code réel est le suivant: xxx

Veuillez noter que j'appelle une méthode ASYNC à l'intérieur d'une boucle de foresach qui provient d'une autre méthode ASYNC. Dans toutes les variations du code, la sortie que je reçois (les journaux de console) sont les suivantes: xxx

donc, la boucle de foresach n'attend pas à la fonction ASYNC à l'intérieur (ce qui est en fait le comportement attendu, AFAIK).

La question est de savoir comment puis-je le faire attendre que l'appel interne soit terminé avant d'ajouter l'obt à la matrice? Merci d'avance.


4 commentaires

Placez l'ajout au tableau à l'intérieur de votre puis ..


Toujours le même résultat, même avoir la poussée à l'intérieur du second puis ()


Op, je suppose que vous avez l'intention d'utiliser myarray après avoir poussé des éléments à celui-ci. Comment allez-vous l'utiliser?


Je vais placer les résultats à l'intérieur d'une table Bootstrap Vue (B-Table) après avoir renvoyé myarray


3 Réponses :


0
votes

Déplacez simplement la poussée à l'intérieur puis comme celle-ci

fb.equiposCollection.doc(myobject.id).get().then(eqp => {
   console.log("The doc id from the other collection is " +eqp.id)

   myarray.push(myobject)
   console.log("myobject pushed to myarray")
})


0 commentaires

1
votes

Soit vous nid code, qui dépend des résultats précédents dans () rappels ou vous enveloppez la boucle ( foreach ne prend pas en charge async) dans async < / code> Block pour utiliser attendre à l'intérieur. par exemple: xxx


3 commentaires

Ce code ne va pas fonctionner comme vous vous attendez. L'appel attendre suspendre la boucle pour la boucle, ce qui signifie que le code ASYNC exécutera séquentiellement plutôt qu'en parallèle. En outre, si l'OP tente d'accéder à myarray en dehors du .Chen () , ce code ne fonctionnera pas du tout (c'est pourquoi dans ma réponse, je supprimai myarray entièrement)


C'est exactement ce que je m'attends à ce que cela fonctionne. J'ai même écrit dans le commentaire qu'il est synchrone. Ce n'est tout simplement pas clair, quel op veut vraiment atteindre. Comme je l'ai compris, il voulait attendre la fonction Get () avant d'ajouter à la matrice, ce qui est exactement ce qui se passe dans mon exemple.


Je pense que vous me comprenez mal. Il a dit dans son commentaire qu'il retournera myarray (posté quelques secondes après votre réponse) et ce code ne supporte pas cela. En outre, synchrones n'est pas tout à fait le mot droit. Ce code sera toujours asynchrone . Mais il sera exécuté en parallèle, pas simultanément. Cela signifie avec une liste de 5 articles que vous aurez 5 voyages aller-retour à la DB l'une après l'autre, avec chacun d'attendre que le précédent se termine avant de continuer. Si cela est ce que vous avez voulu alors, je dois interroger pourquoi vous l'avez écrit de cette façon.



1
votes

La racine du problème est que vous essayez de transformer une opération asychrone (en attente de Firestore pour renvoyer des valeurs) en une synchrone. Ce n'est pas vraiment possible d'une manière significative dans JavaScript sans causer de nombreux problèmes!

Vous devrez remplir votre tableau à l'intérieur du .Chen () code> rappel et retourner Promets em> à la suite de la fonction. Tout appelant qui appelle votre Prestamoitems () code> devra également utiliser .Chen () code> rappels pour accéder à la valeur sous-jacente myARRAY code> valeur: p > xxx pré>

l'exemple de code ci-dessus utilise array.pototype.map () code> pour supprimer "code> myARRAY code> car il n'est pas nécessaire. p>

Un appelant devra utiliser ce code comme celui-ci: P>

_.prestamoItems().then((myarray) => {
   ...
})


3 commentaires

C'est une bonne réponse, mais la réponse acceptée a une structure plus simple. Merci quand même, votre aide est très appréciée


La réponse acceptée fonctionne également différemment: elle récupérera chaque article de la DB dans séquence , pas en parallèle, il sera donc beaucoup plus lent.


J'ai travaillé avec la réponse acceptée et vous avez raison, cela va être séquentiel, il va donc être beaucoup plus lent que prévu sur les grandes collections (j'ai une petite collection en ce moment juste à des fins de test). Je vais modifier mon code comme vous le suggérez