0
votes

Les variables que j'ai mises à jour dans mon forach, retournent à leur valeur initiale

J'essaie d'interroger, cela obtiendrait la totalité de la quantité de gain et de retrait et de la somme, mais d'une manière ou d'une autre, une fois que la boucle de Foreach est terminée et se ferme, toutes les valeurs actualisées que j'ai placées dans une variable retour à leurs valeurs d'origine. < Pré> xxx


1 commentaires

"retourne à sa valeur d'origine" - Nope. Il n'était tout simplement pas encore mis à jour.


5 Réponses :


-1
votes

foreach est asynchrone. Donc, la console.log fonctionne avant votre boucle de mutation. Vous pouvez le rendre synchrone en utilisant mapper , mais même à ce moment-là, vous avez des appels asynchrones à l'intérieur. Vous devrez l'aplatiser davantage - probablement en faisant la promesse.Tous sur une carte, puis réduisez la sortie de cela.


2 commentaires

foreach et cartographique sont synchrones, mais vous avez raison d'utiliser carte avec promess.All


Merci, je viens de vérifier - et je vis dans l'illusion erronée que pourach est asynchrone!



0
votes

Je pense que la raison pourrait être celle des désappelées.findone () et des gains.findone () sont toutes deux des fonctions asynchrones. Cela signifie qu'ils ne reviennent pas immédiatement avec une valeur, d'où vos variables sont toujours la même après la boucle.


0 commentaires

4
votes

Vous exécutez un code asynchrone à l'intérieur du foreach et foreach n'attend pas que le code asynchrone finira, pour le faire, vous devez envelopper votre code ASYNC avec une primitive d'attente , comme ceci xxx


0 commentaires

0
votes

Voici une approche fonctionnelle qui supprime l'effet secondaire de mutation à l'intérieur de la boucle. Vous avez besoin d'un moteur prenant en charge la propagation du repos de l'objet pour cela:

async function calculate(userplans) {
    const add = (acc, n) => acc + n;
    const flatten = (acc, e) => ({
        depositEarnings: [...acc.depositEarnings, e.depositEarnings], 
        earnings: [...acc.earnings, e.earnings]
    });

    const {depositEarnings, earnings} = (await Promise.all(userplans
          .map(async (up) => ({
              depositEarnings: await DepositEarning.findOne({deposit: up.deposit._id}),
              earnings: await Earning.findOne({deposit: up.deposit._id})
}))))
          .reduce(flatten, {depositEarnings: [], earnings: []});

    const withdrawalBalance = depositEarnings
          .map(d => parseInt(d.WithdrawableBalance, 10))
          .reduce(add, 0);
    const totalEarning = earnings
          .map(e => parseInt(e.Earning, 10))
          .reduce(add, 0);

    console.log(withdrawalBalance);
    console.log(totalEarning);
}


0 commentaires

0
votes

juste pour ajouter mes deux cents,

Au fur et à mesure que d'autres réponses ont déclaré, votre foreach utilise un code asynchrone. Il utilise une API qui ne fait pas partie de JS.

L'appel est enfoncé pour appeler la pile, puis il est supprimé de la pile d'appel. Parce que le travail sera traité par l'API maintenant. l'appel à

console.log (retraitbalance); console.log (totalelarning);

est ajouté à la pile d'appels et quelle est la valeur en ce moment? 0 0.

L'API, lorsqu'il est fait avec le travail, ajoutera la fonction dans la file d'attente de tâches et à partir de celui-ci, boucle d'événement vérifiera si la pile d'appel est vide. . Comme il est vide en ce moment, ajoutera la fonction dans la pile d'appels.

Et c'est alors couru. Et ensuite vous aurez les vraies valeurs de retrait et Nombre total d'appréciations valeurs.


0 commentaires