2017-07-10 37 views
0

我正在使用Node JS向数据库发出请求。碰巧我正在做一个SELECT语句,我需要它的结果来做一个INSERT。在节点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); 
    }); 
}; 

由于节点是异步的,结果我从插入从数据库中的第一状态越来越总是当我打电话读帐户()我怎样才能让这个过程同步?

谢谢

+0

JS是异步的,但你要找的是使用结果的回调函数。 –

+0

我知道它是异步的。我只需要调用read_account的函数是同步的。 –

回答

0

您可以在Select函数的回调函数中编写第二个函数。

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

     }); 
}; 

你可以考虑写一个选择和插入两种不同的功能:

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

感谢您的回复!我以不同的方式解决了这个问题。我在数据库和INSERT IGNORE中使用了UNIQUE。这样我简化了功能。 –