0
votes

Empêcher le code d'être exécuté après avoir été

J'essaie actuellement d'obtenir une simple opération de crud dans ReactJS + ExpressJS. J'ai une méthode asyncho sur Submit qui gère la soumission de la forme.

La boucle foreach code> ci-dessous doit contenir des contrôles d'élément de tableau et si la fonction anonyme renvoie false, l'application doit quitter le OnSubmit code>, mais le bloc code> track code> gère le blocage pour être exécuté avant le foreach code> finitions. p>

puisque je n'ai rien à vraiment attendre code> dans mon foreach code> boucle, existe-t-il un moyen de "attendre" jusqu'à ce qu'il finit complètement et le code d'exécution qui se trouve à l'intérieur du bloc code> track code> Garder le Onsubmit code> méthode asynchrone? P>

    onSubmit = async (e) => {
        e.preventDefault();

        if (something) {
                return false;
        }

        // This foreach gets executed after the try-catch below, but I want it to execute first
        someArr.forEach(item => {
            if (item.arr === undefined || item.arr.length == 0) {
                return false;
            }
        });

        try {
            // This has some await axios.post() calls...
        } catch { }
    }


0 commentaires

3 Réponses :


1
votes

Je ne vois aucune raison de la raison pour laquelle vous ne devriez pas être capable d'effectuer toute la logique à l'intérieur du bloc Try-Catch, donnez ceci.

onSubmit = async (e) => {
    e.preventDefault();

    if (something) {
            return false;
    }

    try {
        let should_call = true;
        someArr.forEach(item => {
          if (item.arr === undefined || item.arr.length == 0) {
            should_call false;
          }
        });

        if(should_call){
           // Call has some await axios.post() calls...
        }

    } catch { }
}


0 commentaires

1
votes

La boucle de Foreach est déjà synchrone. Voici une modification de votre méthode qui démontre ceci: xxx


2 commentaires

Le bloc d'essai peut encore être exécuté avant la fin des finitions de Foreach. Au cas où je n'étais pas clair auparavant, je souhaite quitter la méthode Onsubmit si mon if-instruction dans le foreach renvoie false. La réponse @antonku fournie semble être une bonne approche.


Je comprends, mais pour être clair, cela n'a rien à voir avec la boucle de Foreach qui ne sont pas synchrones. La réponse de Antonku est bonne.



2
votes

retour code> instruction à l'intérieur du rapport foreach code> n'empêche pas d'essayer d'évaluer l'évaluation de capture car ce retour code> est à l'intérieur du rappel, de sorte qu'il revient de la Callback au lieu de la fonction externe Onsubmit code>.

Si je comprends bien l'intention est de revenir de Onsubmit code> si un élément de la matrice répond à la condition: (item.arr === non défini || item.arr.length == 0) code> p>

Si c'est correct, vous pouvez la réécrire à l'aide de Array.Prototype.Some : P>

onSubmit = async (e) => {
  e.preventDefault();

  if (something) {
    return false;
  }

  const shouldReturn = someArr.some(item => item.arr === undefined || item.arr.length === 0);

  if (shouldReturn) {
    return;
  }

  try {
    // This has some await axios.post() calls...
  } catch { }
}


2 commentaires

Merci. Quelque chose est venu dans mon esprit après. Si j'avais un autre tableau à l'intérieur du item.arr , l'approche d'un d'une est-elle imbriquée?


Je vous en prie! Oui, s'il existe une matrice à l'intérieur d'un article de tableau et que vous devez appliquer une validation similaire - Netthed Certains peuvent être un moyen d'aller. Si le code devient surveillé avec cela, vous pouvez définir un rappel transmis à quelques dans la portée extérieure (au lieu de la définir en ligne comme une fonction anonyme) afin d'améliorer la lisibilité.