2017-08-29 3 views
0

Je suis en train de chercher des résultats et faire le traitement ultérieur en fonction de ces résultats, mais je ne peux pas continuer à travailler séquentiellement,noeud mysql exécution de la requête séquentielle

var sql = query1; 

    con.query(sql, function (err, results) { 
     if (err) throw err; 
    // ids => 5,2,3,4 
     for (i = 0; i < results.length; i++) { 

     target_user = results[i].ID 

     var sql = "DELETE QUERY"; 

     con.query(sql, function (err) { 
      if (err) throw err; 
      console.log(target_user) 

      var sql = "INSERT QUERY"; 
      console.log(sql) 
      con.query(sql, function (err) { 
      if (err) throw err; 

      }) 
     }) 


     } 
    }) 

Le code ci-dessus fonctionne de manière asynchrone, Qu'est-ce que J'Expect est une sortie dans une boucle comme celui-ci

// "DELETE QUERY"; 
//5 
// "INSERT QUERY"; 
// "DELETE QUERY"; 
//2 
// "INSERT QUERY"; 

et ainsi de suite ..

mais ce que je reçois est

// "DELETE QUERY"; 
//5 
// "DELETE QUERY"; 
//5 //not fetching the next array val 
// "INSERT QUERY"; 
// "INSERT QUERY"; 

Toute aide est très appréciée.


EDIT

de réponses que je code mis à jour comme celui-ci

maintenant le code ressemble à ceci

aysnc.forEach(results, function(elem, callback){ 
target_user = elem.id 
    console.log('out') 
        console.log(target_user) 
        con.query(sql, function (err) { 
         if (err) throw err; 
         console.log('in') 
        console.log(target_user) 
}) 
}) 

Une chose étrange que la production est

out 
5 
in 
5 
out 
2 
in 
5 //when it is supposed to be 2 

Répondre

1

Vous pouvez utiliser la récursivité pour résoudre quelque chose comme ça. Gardez fonction d'appel jusqu'à ce qu'il n'y a pas d'éléments laissés dans les résultats

con.query(sql, function (err, results) { 
    if (err) throw err; 
    deleteAndInsertResults(results); 
}) 

function deleteAndInsertResult(results) 
{ 
    target_user = results[0].ID 

    var sql = "DELETE QUERY"; 

    con.query(sql, function (err) { 
     if (err) throw err; 
     console.log(target_user) 

     var sql = "INSERT QUERY"; 
     console.log(sql) 
     con.query(sql, function (err) { 
     if (err) throw err; 
     results.shift(); 
     if(results.length){ 
      return deleteAndInsertResult(results); 
     } 

     }) 
    }) 
} 
+1

est la seule solution qui a fonctionné! Merci. –

0

Dans Node.js boucle FOR sera exécuté en parallèle, donc utiliser async module ou PROMESSE ci-dessous est un exemple à l'aide async

var async = require('aynsc'); 
con.query(sql, function (err, results) { 
    if (err) throw err; 
// ids => 5,2,3,4 
async.forEach(results, function(elem, callback){ 

    target_user = results[i].ID 

    var sql = "DELETE QUERY"; 

    con.query(sql, function (err) { 
     if (err) throw err; 
     console.log(target_user) 

     var sql = "INSERT QUERY"; 
     console.log(sql) 
     con.query(sql, function (err) { 
     if (err) throw err; 
     callback() 
     }) 
    }) 
}, function(err){ 
//final callback once loop is done 
}); 
}) 
+0

merci, je votre code, mais coincé, modifié ma question, s'il vous plaît se référer si vous pouvez aider à ce sujet, ce –