2017-07-10 5 views
0

Ich benutze Node JS, um eine Anfrage an eine Datenbank zu stellen. Es passiert, dass ich eine SELECT-Anweisung mache und ich brauche danach ein INSERT.Schleife synchron in Knoten 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); 
    }); 
}; 

Da Knoten asynchron ist, die Ergebnisse Ich bin von der INSERT bekommen werden immer aus dem ersten Zustand der Datenbank, wenn ich lese-Konto() aufrufen Wie kann ich diesen Prozess synchron zu machen?

Danke

+0

JS asynchron ist, aber was Sie suchen ist eine Callback-Funktion Ihre Ergebnisse mit. –

+0

Ich weiß, es ist asynchron. Ich brauche nur die Funktion, die read_account aufruft, um synchron zu sein. –

Antwort

0

Sie können die zweite Funktion in dem Rückruf Ihrer Funktion auswählen schreiben.

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; 
        }); 
      } 

     }); 
}; 

können Sie prüfen, für Auswahl und Einsatz zwei verschiedene Funktionen schreiben:

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

Danke für die Antwort! Ich habe das Problem jedoch auf andere Weise gelöst. Ich habe UNIQUE in der Datenbank und INSERT IGNORE verwendet. So habe ich die Funktionen vereinfacht. –