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

NodeJS Discussion :

Ordre d'execution dans boucle foreach


Sujet :

NodeJS

  1. #1
    Membre du Club
    Ordre d'execution dans boucle foreach
    Bonsoir à tous,

    j'ai un petit problème de compréhension dans le fonctionnement asynchrone de certaines fonction nodejs.
    DAns le bout de code ci dessous, dans mon foreach le tableau est parcouru puis une fois terminé il rentre dans les con.query(32 fois).(resultat du log sous le code)
    Je ne comprend pas pq cela effectue console.log(3) et console.log(4) avant les requêtes ?

    Merci d'avance pour vos eclaircissements
    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
     
    fs.readFile('./hello.json','utf8', function(err,data) {
            if(err)
            throw err;
            data = JSON.parse(data);
            data.forEach(function(element, index, array){
                    con.query("SELECT idStrava FROM segment WHERE idStrava = " + element['id'], function(err, result, fields){
                        console.log(0);
                        if(result.length <= 0) {                        
                            var param = [element['id'], 
                                        blabla ...
                                        ]
                            var sql = 'INSERT INTO segment VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
     
                            con.query(sql, param,function(err, result) {
                                if(err) throw err;
                                console.log("datas inserted");
                            });
                        }
                    });
                    console.log(1);
                    con.query("SELECT * FROM segment_effort WHERE idStrava ="+element['time']['id'], function(err, result, fields){
                    console.log(2);
     
                        if(result.length == 0) {
                            var param = [
                                blabla...
                            ];
                            var sql = "INSERT INTO segment_effort (idStrava, segment_id, resource_state, elapsed_time, moving_time, start_date, start_date_local, start_index, end_index, average_watts, average_heartrate, max_heartrate)VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
                            con.query(sql, param, function(err, result){
                                if(err) throw err;
                                console.log("data inserted") 
                            });
                        }
                    });
     
                    console.log(3)
                if( element['id'] in seg) {
                    console.log(4);
                } else {
                    console.log(4);
                }
                console.log("index : "+index);
            });
        res.render('index.html.twig', {segment:seg});
        });


    le log:
    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
     
    index : 493
    1
    3
    4
    index : 494
    1
    3
    4
    index : 495
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2
    0
    2

  2. #2
    Modérateur

    Bonjour,
    Je ne comprend pas pq cela effectue console.log(3) et console.log(4) avant les requêtes ?
    il serait plus exact de dire avant le retour des requêtes, c'est cela l'asynchrone, le script continu « sa route » pendant que la requête court et revient !

  3. #3
    Membre du Club
    Bonjour no Smoking,

    merci pour ce retour. Effectivement c'est que j'ai fini par comprendre. Mais je ne pensais pas qu'une requête prenait autant de temps a s'executer