附加到匿名函数内的对象

时间:2014-04-10 10:57:33

标签: javascript node.js underscore.js

我试图将db查询的结果附加到表中,如下所示:

function foo() {
    var result = {};

    pool.getConnection(function(err, connection) {
        if(err) {
            console.log("Problem establishing connection with the database");
            return;
        }

        var tables = ["first", "second", "third"];

        _.forEach(tables, function(table) {
            var query = "SELECT * FROM " + table;

            connection.query(query, function(err, data) {
                if(!err) {
                    result[table] = data;
                } else {
                    console.log("Problem performing query \"%s\"", query);
                }
            });
        });
    });

    return result;
}

返回的结果为空,但在forEach内,正在填充。我可以通过在循环中添加日志消息来证明这一点。

我只能认为这是一个范围问题但是当我将结果更改为属性(this.result)并尝试从循环中分配时,我得到相同的结果。我确保通过在函数开头添加this并在循环内部分配var that = this;来确保使用正确的that.result实例。

2 个答案:

答案 0 :(得分:3)

这不是一个范围问题,而是一个时间问题。

您在 result填写之前尝试返回result ,因为匿名函数中的代码在您的{之后才会运行{1}}函数返回。它是异步。我希望foo调用也是异步的。

由于query依赖异步来完成其工作,因此无法返回结果。它必须执行foogetConnection所做的事情:接受它稍后将调用的回调函数。

以下是您可能采用的一种方式,请参阅代码注释:

query

答案 1 :(得分:1)

因为查询函数是异步的,所以当代码首次运行时,它会发送查询,然后返回空白对象,因为查询尚未返回。

当查询返回时,应该填写该对象的属性,但是您需要在那时运行一些代码才能“看到”它。如果您希望代码从该函数返回填充的对象,您会感到失望。 : - )