2017-09-25 20 views
1

我正在調用函數,以便使用mysql模塊node.js將一些值插入到數據庫表中。該函數在for循環內部調用,我可以在函數內部獲取每個INSERT查詢的最後一個insertId使用node.js + mysql的最後一個insertId的全局範圍

我的目的

我想這些id's存儲到數組中,以在我的代碼中使用它們,但我不能做到這一點。

- 函數調用

for(var i=0;i<some_number;i++){ 
    if (<something is true>){ 

    var lastid = []; 
    //Function calling 
    function_a(x, y, z, w, function(error, result) { 
    if(!error){ 
     lastid.push(result.insertId); 
     } 
    //To Do 
    else{} 
    }); 
} 
} 

- 功能

function function_a(a, b, c, d, callback){ 
//Connection to the DB 
const con = mysql.createConnection({ 
    host: 'host', 
    user: 'user', 
    password: 'password', 
    database: 'database' 
}); 

//DB query 
var query = "INSERT INTO my_table (column1, column1, column1, column1) VALUES ('"+a+"', '"+b+"', '"+c+"', '"+d+"')"; 
con.query(query, (err, rows) => { 
var e = rows.insertId; 
return callback(err, e); 
}); 
con.end(); 
} 

的問題是,我不能使用id的功能之外。

任何想法我該怎麼做?這是關於變量範圍?

回答

0

這裏有幾個問題,是的,它們部分是關於變量的範圍。

var lastid = [];放在for循環之前,所以你可以在循環之後使用它。但是,由於循環中有回調機制,因此必須等待整個循環完成(所有回調從0調用到some_number-1,以便在lastid數組中具有正確的值。回調函數很麻煩,但可以和他們並承諾做到這一點,您可以谷歌的回調處理,在for循環

+0

謝謝爲你的答案。我終於相信這是關於使用回調函數時的變量範圍。每一次嘗試我使用ID的'數組'總是空的。你有任何電子郵件xample可以幫助我嗎? – GeoDim

+0

它是空的,因爲你在for循環之後調用它,但是,不能保證for循環完成迭代。這是由於其中的異步操作(例如數據庫查詢)而發生的。爲了做到這一點,你可以看看[這個循環回調模式](http://www.richardrodger.com/2011/04/21/node-js-how-to-write-a-for-loop- with-callbacks /#。WcixIFuCyUk)或[此示例](promise)(https://stackoverflow.com/questions/28736452/bluebird-promise-serial-iteration-and-resolve-to-modified-array)promise.each )功能使用。 – cassini

0

功能function_aasynchronous功能在你的情況,你可以使用async模塊做這個任務:。

var taskIds = Array.apply(null, {length: some_number}).map(Number.call, Number); 
var lastid = []; 
async.eachLimit(taskIds, 32, function (taskId, done) { 
    if (<something is true>) { 
    function_a(x, y, z, w, function(error, result) { 
     if(!error){ 
     lastid.push(result.insertId); 
     } 
     //To Do 
     else{} 
     done() 
    }); 
    } else { 
    done() 
    } 
}, function() { 
    // Do some thing with lastid 
    console.log(lastid); 
}); 
+0

感謝您的回覆,但它不起作用。我應該需要一些模塊用於'async.eachLimit'嗎? – GeoDim

+0

@GeoDim是的,'async'是一個像'mysql'這樣的助手模塊。 https://caolan.github.io/async/docs.html – hoangdv