我目前正在使用nodeJS截断数据库中60个表的列表。
为此,我正在使用此代码:
var mysql = require('mysql');
var connexion = mysql.createConnection({
host : '1.1.1.1',
user : 'user',
password : 'password',
database : 'db'
});
connexion.connect();
var tableList = [
'table0',
'table1',
'table2',
...
];
console.log('\n### Truncating tables... ###');
var i;
for(i = 0; i < tableList.length; i++){
connexion.query('TRUNCATE '+tableList[i]+';', function(err, rows, fields){
if(err) throw err;
console.log(i+'===> '+tableList[i]+' truncated.')
});
}
问题是输出总是:
60===> undefined truncated.
60===> undefined truncated.
60===> undefined truncated.
60===> undefined truncated.
60===> undefined truncated.
60===> undefined truncated.
我有两个问题,在回调函数中无法访问tableList数组,并且回调函数一直认为i = 60是正确的值。
我做错了什么?
我希望有类似的东西:
0===> table0 truncated.
1===> table1 truncated.
...
答案 0 :(得分:0)
Classic - 异步+循环不能很好地混合。
你得到变量i
。它从0
循环到tableList.length - 1
,并在tableList.length
处停止。对于每一个,您都可以使用回调启动异步请求。
现在回调开始打击你,但i
为tableList.length
,而tableList[i]
不存在。 (tableList
本身是可访问的,处于关闭状态;由于i
具有循环结束后剩余的任何值,您只是在其结束时点击。)
如何解决?在IIFE中包装循环的内容,传入循环计数器(或取决于循环计数器的值),这样你就不会因为关闭错误而得到不良影响:
for (i = ....) {
(function(i) {
...
})(i);
}