Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 附加到匿名函数内部的对象_Javascript_Node.js_Underscore.js - Fatal编程技术网

Javascript 附加到匿名函数内部的对象

Javascript 附加到匿名函数内部的对象,javascript,node.js,underscore.js,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 t

我试图将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
)并尝试从循环中分配给该属性时,我得到了相同的结果。通过添加
var that=this,我确保使用了
this
的正确实例并在循环内部将.result赋值给

这不是范围问题,而是时间问题

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

因为
foo
依赖于异步的东西来完成它的工作,所以它不能返回结果。它必须做
getConnection
query
要做的事情:接受一个回调函数,稍后它将调用该函数并得到结果

下面是一种方法,请参见代码注释:

function foo(callback) { // <== Note `callback`

    pool.getConnection(function(err, connection) {
        if(err) {
            console.log("Problem establishing connection with the database");
            callback(null); // Do the callback, with a flag value for failure
            return;
        }

        var tables = ["first", "second", "third"];
        var result = {};
        var results = 0; // Remember how many results we've seen
        _.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);
                    result[table] = null; // Flag value for failure
                }
                if (++results === tables.length) {
                    // We're done, issue the callback
                    callback(results);
                }
            });
        });
    });
}

函数foo(callback){/这不是范围问题,而是时间问题

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

由于
foo
依赖于某个异步的东西来完成其工作,因此它无法返回结果。它必须执行
getConnection
query
所做的操作:接受一个回调函数,稍后它将调用该函数并得到结果

下面是一种方法,请参见代码注释:

function foo(callback) { // <== Note `callback`

    pool.getConnection(function(err, connection) {
        if(err) {
            console.log("Problem establishing connection with the database");
            callback(null); // Do the callback, with a flag value for failure
            return;
        }

        var tables = ["first", "second", "third"];
        var result = {};
        var results = 0; // Remember how many results we've seen
        _.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);
                    result[table] = null; // Flag value for failure
                }
                if (++results === tables.length) {
                    // We're done, issue the callback
                    callback(results);
                }
            });
        });
    });
}

function foo(callback){/因为查询函数是异步的,当代码第一次运行时,它发送查询,然后返回空白对象,因为查询还没有返回


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

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


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

此sql调用是同步的还是异步的?此sql调用是同步的还是异步的?