IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Promise et boucle forEach


Sujet :

JavaScript

  1. #1
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut Promise et boucle forEach
    Bonjour à tous,

    J'ai besoin d'aide afin de mettre en place les Promises...

    Je souhaite effectuer la validation d'un formulaire à l'aide de promise étant donné que certains champs effectuent des appels Ajax pour lors de la validation. Ci-dessous se trouve le code mis en place :

    Le problème qui se pose, est que le formulaire se valide avant le retour de l'appel ajax. Pouvez-vous m'aider ?

    Merci d'avance,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    btSubmit.on('click', async (e) => {
                    e.preventDefault();
                    e.stopPropagation();
     
                    let check = await verifForm(form);
     
                    console.log('----- SUBMIT FORM -----', check);
     
                });
     
    async function verifForm(form) {
                    var promises = [];
                    console.log('avant foreach');
                    await $.each(form[0], async (index, champs) => {
                        if (champs.hasAttribute('required')) {
                            console.log('avant callback', champs.name);
                            await options.callback(champs);
                            console.log('après callback', champs.name);
                        }
                    });
                    console.log('après forEach');
                }
    ...
    callback: (champs) => {
                var result = true;
                if (!champs.checkValidity()) {
                    champs.classList.add('is-invalid');
                    result = "Ce champs est obligatoire";
                } else {
                    if (champs.name == 'matricule') {
                        console.log('--- start matricule');
                        result = verifMatricule(champs.value);
                        console.log('--- stop matricule');
                    }
                }
                return result;
            }
     
    function verifMatricule(valeur) {
        var data = {champsATester: 'matricule', matricule: valeur};
        return $.ajax({
            url: "ajax/users/ajax.gestion_utilisateur.php",
            dataType: 'text',
            data: data,
            type: 'post'
        });
    }
    Gnarf !
    Mon C.V.
    Culture agile && Software Craftsmanship && (.NET {VS 2019 && WPF} || PHP {(PHPStorm || VS Code) && (Docker)})

    Pensez au TAG

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bonsoir,
    le seul moyen fiable d’empêcher la soumission d’un formulaire c’est d’agir sur l’évènement submit de ce formulaire. Empêcher un clic sur un bouton ne suffit pas.

    D’autre part, il y a différentes choses qui me semblent bancales dans ton code.
    • Je suis à peu près sûr que $.each ne renvoie pas de promesse, et donc le await qui est devant ne fait pas ce que tu penses : il rend le reste de la fonction asynchrone mais son « temps d’attente » est nul.
    • la callback n’est pas async, donc elle devrait renvoyer une promesse dans tous les cas. Ce n’est pas vrai dans le cas où "ce champ est obligatoire". Il faudrait faire result = Promise.resolve("ce champ est obligatoire"). Sinon on est dans le cas ci-dessus : ça marche, mais ça ne fait pas ce que tu penses.
    • moins important mais j’ai envie de le dire : l’option type de $.ajax est confusante, on préfère écrire method. Et c’est encore mieux si 'POST' est en majuscules
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. [JSTL] boucle forEach pour deux liste en même temps
    Par ruud002 dans le forum Taglibs
    Réponses: 1
    Dernier message: 28/09/2006, 15h54
  2. [Tableaux] Boucle foreach inbriquée
    Par nebil dans le forum Langage
    Réponses: 17
    Dernier message: 10/09/2006, 11h40
  3. [C# VS 2005] Collection et boucle foreach
    Par SDragon dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/07/2006, 19h43
  4. [C# 1.1]Boucles foreach imbriquees
    Par Nip dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/04/2006, 16h35
  5. [Tableaux] la boucle foreach
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 09/03/2006, 17h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo