2017-07-10 107 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。這樣我簡化了功能。 –