我正在调用功能,以便使用node.js
的mysql
模块将一些值插入数据库表中。该函数在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_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);
});