优雅地将变量传递给异步回调

时间:2014-08-10 15:28:06

标签: javascript mysql node.js closures

我正在编写一段代码来构建来自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'])
    });
});

1 个答案:

答案 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循环不会引入新作用域,并且迭代变量最终会被所有回调共享(它最终会指向最后一个元素)。