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: p> 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: p> donc, la boucle de foresach n'attend pas à la fonction ASYNC à l'intérieur (ce qui est en fait le comportement attendu, AFAIK). P> 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. P> p>
3 Réponses :
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") })
Soit vous nid code, qui dépend des résultats précédents dans () code> rappels ou vous enveloppez la boucle (
foreach code> ne prend pas en charge async) dans
async < / code> Block pour utiliser
attendre code> à l'intérieur. par exemple:
Ce code ne va pas fonctionner comme vous vous attendez. L'appel code> attendre code> 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 code> en dehors du
.Chen () code>, ce code ne fonctionnera pas du tout (c'est pourquoi dans ma réponse, je supprimai
myarray code> 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 code> (posté quelques secondes après votre réponse) et ce code ne supporte pas cela. En outre, synchrones i> n'est pas tout à fait le mot droit. Ce code sera toujours asynchrone i>. 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 i> ce que vous avez voulu alors, je dois interroger pourquoi vous l'avez écrit de cette façon.
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 l'exemple de code ci-dessus utilise Un appelant devra utiliser ce code comme celui-ci: P> .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 >
array.pototype.map () code> pour supprimer "code> myARRAY code> car il n'est pas nécessaire. p>
_.prestamoItems().then((myarray) => {
...
})
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 i>, 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
Placez l'ajout au tableau à l'intérieur de votre
puis code> ..
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 code> 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