使用node.js mySQL的最后插入范围的全局范围



我正在调用功能,以便使用node.jsmysql模块将一些值插入数据库表中。该函数在for循环中被调用,我可以在功能中获取每个INSERT查询的最后一个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。

有什么想法我该怎么做?这是关于可变范围的吗?

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

var lastid = [];放在for循环之前,因此您可以在循环后使用它。但是,由于循环内有回调机制,因此您必须等待整个循环完成(所有回调从0到some_number-1,才能在lastid数组中具有正确的值。这是一个混乱的回调,但是您可以与他们或承诺一起做。

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

最新更新