最后一个insertId的全局范围使用node.js + mysql

我正在调用函数,以便使用node.js mysql模块将一些值插入到数据库表中。 该函数在for循环中被调用for并且我可以在函数内部获得每个INSERT查询的最后一个insertId

我的目的

我想将这些id's存储到数组中,以便稍后在我的代码中使用它们,但是我不能这样做。

– function呼叫

  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 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的function外。

任何想法我怎么能这样做?这是关于variables范围?

这里有几个问题,是的,它们部分是关于可变范围的。

var lastid = []; 在for循环之前,所以你可以在循环之后使用它。 然而,由于循环中有callback机制,所以必须等待整个循环完成(所有从0调用到some_number-1callbacksome_number-1 ,以便在lastid数组中有正确的值。你可以用他们或承诺来做到这一点,你可以在谷歌for循环callback处理。

函数function_a是一个asynchronous函数。 在你的情况下,你可以使用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); });