NodeJS, mysql和异步结果
NodeJS, mysql, and async results
我目前正在使用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.
...
经典- async +循环不能很好地混合。
得到变量i
。它从0
循环到tableList.length - 1
,并在tableList.length
停止。对于每一个,你启动一个异步请求,带一个回调。
现在回调开始击中你,但i
是tableList.length
, tableList[i]
不存在。(tableList
本身是可访问的,处于关闭状态;由于i
在循环结束后剩下的任何值,你只是超过了它的结束。)
如何解决?在IIFE中包装循环的内容,传递循环计数器(或取决于循环计数器的值),这样你就不会因为闭包关闭了错误的东西而产生不良影响:
for (i = ....) {
(function(i) {
...
})(i);
}
相关文章:
- 函数式javascript读取、异步、写入结果
- Typeahead.js未显示异步结果
- Meteor:如何遍历一个数组,这是一个异步方法的结果
- 根据两个异步函数调用的结果执行
- backbone.js视图没有't由于异步获取而显示结果;t渲染
- Mongoose查找结果和异步
- 等待异步结果的 Chrome 系统调用
- 没有结果的异步查找会挂起应用
- 如何从异步.js系列返回结果
- 异步功能在预期结果时停止工作
- 为什么同步使用承诺会返回异步结果
- 角度类型提前异步结果 - 收到错误“类型错误:无法使用'in'运算符搜索 ..在..".
- 为什么我在 JavaScript 中的回调不适用于异步结果
- NodeJS从函数返回异步结果
- 从自定义panoProvider返回异步结果
- JQueryUI自动完成如何处理异步结果
- 在nodejs中添加异步结果到数组
- 如何在循环中调用时显示JS异步结果
- 异步结果——express, mongoose, node, bluebird, Async等等
- NodeJS, mysql和异步结果