2017-07-10 1 views
0

J'utilise Node JS pour faire une demande à une base de données. Il arrive que je fasse une instruction SELECT et j'ai besoin de résultat pour faire un INSERT après.Faire une boucle de manière synchrone dans le nœud JS

var index = 1; 
    async.whilst(
     function() { return index < 10; }, 
     function(callback) { 
      index++; 
      let line = csv_json[index][0].split(';'); 
      let block = csv_json[index]; 
      read_account(line); 
      callback(null, index); 
     }, 
     function(err, n) { 
      if (err) throw err; 
     } 
    ); 


function read_account(csv, index) { 
    if (index == csv_json.length) return; 

    let line = csv_json[index][0].split(';'); 
    let block = csv_json[index]; 
    var account = line[0]; 

    waterfall([ 
     function(callback) { 
      connection.query('SELECT id FROM account WHERE account_number = ' + account, 
       function(error, results, fields) { 
        if (error) 
         throw error; 
        console.log(results); 
        callback(null, results); 

       }); 

     }, 
     function(results, callback) { 

      if (results == null || typeof results == undefined || results.length == 0) { 
       console.log("ENTREI"); 
       connection.query('INSERT INTO account (account_number) VALUES (' + account + ')', 
        function(err, results, fields) { 

         callback(err, "1 account inserted!") 
         if (err) 
          throw err; 
        }); 
      } 
      //else callback(null,"record already in db") 

     }, 
    ], function(err, success) { 
     if (err) throw err; 
     //console.log(success); 
    }); 
}; 

Depuis nœud est asynchrone, les résultats que je reçois de l'INSERT sont toujours du premier état de la base de données quand je lis appel compte() Comment puis-je faire de ce processus synchrone?

Merci

+0

JS est asynchrone, mais ce que vous cherchez est une fonction de rappel à l'aide de vos résultats. –

+0

Je sais que c'est asynchrone. J'ai juste besoin que la fonction appelée read_account soit synchrone. –

Répondre

0

Vous pouvez écrire la deuxième fonction dans le rappel de votre fonction de sélection.

function read_account(csv, index) { 
    if (index == csv_json.length) return; 

    let line = csv_json[index][0].split(';'); 
    let block = csv_json[index]; 
    var account = line[0]; 
    connection.query('SELECT id FROM account WHERE account_number = ' + account, 
     function(error, results, fields) { 
      if (error) 
       throw error; 
      console.log(results); 

      if (results == null || typeof results == undefined || results.length == 0) { 
       console.log("ENTREI"); 
       connection.query('INSERT INTO account (account_number) VALUES (' + account + ')', 
        function(err, results, fields) { 

         callback(err, "1 account inserted!") 
         if (err) 
          throw err; 
        }); 
      } 

     }); 
}; 

Vous pouvez envisager d'écrire deux fonctions différentes pour sélectionner et insérer:

function select(callback){ 
connection.query('SELECT id FROM account WHERE account_number = ' + account, function(error, results, fields) { 
     if (error) { 
     return callback(error); 
     } else { 
     return callback(null, results, fields); 
     } 
    }); 
} 

function insert(results, fileds, callback){ 
    connection.query('INSERT INTO account (account_number) VALUES (' + account + ')', 
     function(err, results, fields) { 
      if (err){ 
      return callback(err); 
      } else { 
      return callback(null, "1 account inserted!") 
      } 
     }); 
} 

function read_account(csv, index, callback) { 
    if (index == csv_json.length) return; 
    let line = csv_json[index][0].split(';'); 
    let block = csv_json[index]; 
    var account = line[0]; 

    select(function(null, results, fields){ 
     if(err){ 
     return callback(err); 
     } else { 
     insert(results, fileds, callback); 
     } 
    }); 
    } 
+0

Merci pour la réponse! J'ai résolu le problème d'une manière différente cependant. J'ai utilisé UNIQUEs dans la base de données et INSERT IGNORE. De cette façon, j'ai simplifié les fonctions. –