我正在编写一段代码来构建来自DB的模式,并基于SE上的其他示例,我想出了这种方式将表名一直传递给代码,我将处理表字段(I需要访问当时的表名)。模式来自MySQL使用jugglingdb-mysql。
这是最优雅的'我可以这样做(我不希望代码中有闭包,因为它们现在已经写好了)?
schema.client.query('SHOW TABLES', function(err, data) {
if (err) throw err;
data.forEach(function(table) {
// closure to pass down table name
(function(_table) {
schema.client.query('SHOW columns FROM ' + _table, function(err, rows) {
if (err) throw err;
// closure to pass down table name
(function(_table) {
rows.forEach(function(row){
// Go wild processing fields
})
})(_table);
});
})(table['Tables_in_db'])
});
});
答案 0 :(得分:0)
内部函数从外部函数继承变量。在这种情况下,您不需要传递变量的所有麻烦,以下内容应该足够了:
data.forEach(function(table) {
var _table = table['Tables_in_db'];
schema.client.query('SHOW columns FROM ' + _table, function(err, rows) {
if (err) throw err;
rows.forEach(function(row){
// Go wild processing fields
})
});
});
您需要使用立即调用的函数执行此操作的唯一时间是创建callbacks inside for-loops时。由于Javascript作用域是基于函数而不是基于块的,因此for循环不会引入新作用域,并且迭代变量最终会被所有回调共享(它最终会指向最后一个元素)。