NodeJS,mysql和异步结果

时间:2015-06-01 05:45:40

标签: javascript mysql node.js asynchronous

我目前正在使用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.
...

1 个答案:

答案 0 :(得分:0)

Classic - 异步+循环不能很好地混合。

你得到变量i。它从0循环到tableList.length - 1,并在tableList.length处停止。对于每一个,您都可以使用回调启动异步请求。

现在回调开始打击你,但itableList.length,而tableList[i]不存在。 (tableList本身是可访问的,处于关闭状态;由于i具有循环结束后剩余的任何值,您只是在其结束时点击。)

如何解决?在IIFE中包装循环的内容,传入循环计数器(或取决于循环计数器的值),这样你就不会因为关闭错误而得到不良影响:

for (i = ....) {
  (function(i) {
    ...
  })(i);
}