Partage
  • Partager sur Facebook
  • Partager sur Twitter

AJAX et query myslq

    5 septembre 2018 à 17:22:03

    Bonjour,

    Le code ci-dessous répond à une requête AJAX envoyée à mon serveur nodeJS. Mon serveur reçoit la requête puis la traite en allant chercher les noms associés au numéro (ref) du projet lui permettant de récupérer les âges contenues dans une table prévue à cet effet. Chaque âge trouvé est inseré dans un tableau, array_age. Pour finir, je réponds à ma requête AJAX en envoyant le tableau en prenant soin de l'entourer d'un setTimeout() pour éviter que la réponse soit envoyée avant que le tableau est fini d'être rempli.
    Je ne suis pas sûr que cela soit très propre :euh:. En effet, si les query prennent trop de temps mon  "setTimout()"  va se déclencher et il enverra un tableau array_age vide ou à moitié rempli...

    Comment peut-on faire pour éviter ce genre de problème ?

    server.js

    app.post('/get_age', function (req, resp) {
     
        var array_age = []
        //Selectionner tous les nom qui sont associé
        connection.query('
            SELECT A.*
            FROM
                myTableName N
                    INNER JOIN myTableAge A
                        ON N.name = A.name
            WHERE N.ref = ?',
            [req.body.ref],
            function (error, results) {
                if (error) {
                    throw error;
                } else {
                    array_age.push(results)
                }
            }
        );
     
        setTimeout(function () {
            resp.json({ data: array_age })
        }, 100);
    });



    • Partager sur Facebook
    • Partager sur Twitter
      5 septembre 2018 à 17:42:45

      Salut, je t'invite à regarder du coter des promises !

      Avec une promise, cela donnerait : (Je n'ai pas testé mais c'est pour te montrer le principe)

       app.post('/get_age', function (req, resp) {
          new Promise((resolve, reject) => {
              var array_age = []
              //Selectionner tous les nom qui sont associé
              connection.query('
                  SELECT A.*
                  FROM
                      myTableName N
                          INNER JOIN myTableAge A
                              ON N.name = A.name
                  WHERE N.ref = ?',
                  [req.body.ref],
                  function (error, results) {
                      if (error) {
                          reject(error);
                      } else {
                          array_age.push(results)
                          resolve(array_age);
                      }
                  }
              );
          }).then(array => {
              resp.json({ data: array })
          }).catch(err => {
              throw err;
          })
      });

      -
      Edité par Martinoss 5 septembre 2018 à 17:48:52

      • Partager sur Facebook
      • Partager sur Twitter
        6 septembre 2018 à 9:29:53

        Merci @Martinoss,

        En effet, les promises semblent adaptés à ce que je cherche à faire.

        Si je reprends le code que j'ai mis dans mon premier message est que je le transforme un peu, comment faudrait-il placer les promises ?

        app.post('/get_age', function (req, resp) {
         
                var array_age = []
                //Selectionner tous les nom qui sont associé
                connection.query('SELECT * FROM myTableName WHERE ref = ?',[req.body.ref], function (error, results) {
                    if (error) {
                        throw error2;
                    } else {
         
                        for (var i in results) {
                             
                            connection.query('SELECT * FROM myTableAge WHERE name = ' + results[i].name + '', function (error2, results2) {
                                if (error) {
                                    throw error2;
                                } else {
                                     array_age.push(results2)
                                }
                            });
                        }
                    }
                });
         
                setTimeout(function () {
                    resp.json({ data: array_age })
                }, 100);
            });
                           
         }
        });



        • Partager sur Facebook
        • Partager sur Twitter
          6 septembre 2018 à 13:33:34

          Je t'ai mis un exemple dans mon précédant message :)
          • Partager sur Facebook
          • Partager sur Twitter
            6 septembre 2018 à 14:41:25

            Ok, j'ai relevé le défi :soleil:. Bon c'est un peu barbare :pirate:, mais ça donne ça :

            app.post('/get_age', function (req, resp) {
                new Promise(function (resolve, reject) {
                    var array_age = []
                    //Selectionner tous les nom qui sont associé
                    connection.query('SELECT * FROM myTableName WHERE ref = ?', [req.body.ref], function (error, results) {
                        if (error) {
                            reject(error);
                        } else {
            
                            var $length = results.length;
                            for (var i = 0, p = Promise.resolve(); i < $length; i++) {
                                p = p.then(_ => new Promise(function (resolve) {
            
                                    connection.query('SELECT * FROM myTableAge WHERE name = ' + results[i].name + '', function (error2, results2) {
                                        if (error) {
                                            throw error2;
                                        } else {
                                            array_age.push(results2)
                                        }
                                    });
                                }));
                            }
            
                            resolve(array_age);
                        }
                    });
                }).then(function (array) {
                    resp.json({ data: array })
                }).catch(function (err) {
                    throw err;
                })
            });



            • Partager sur Facebook
            • Partager sur Twitter

            AJAX et query myslq

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown