无法在子范围内修改父范围变量

时间:2017-03-14 22:27:10

标签: javascript node.js scope closures

我是Javascript和node.js的新手,我在使用它时遇到了一些麻烦。据我所知,这应该产生预期的结果,但我有一些相当奇怪的输出(参见评论)。

function getHistoryFromDb() {
    var rows=1;
    pool.getConnection(function (err, connection) {
        // rows = 1
        console.log(rows);
        connection.query('SELECT * FROM messages', function (error, results, fields) {
            connection.release();
            if (error) throw error;
            // rows = 1
            rows = results;
            // rows = the expected output (array of objects)
        });
    });
    // rows = 1
    return rows;
}

感谢您的帮助!

编辑:看起来这更像是一个与异步执行相关联的问题 EDIT2:问题解决了,不得不使用回调而不是尝试使用return ...

1 个答案:

答案 0 :(得分:0)

    function getHistoryFromDb(callback) {
        var rows=1;
        pool.getConnection(function (err, connection) {
            // rows = 1
            console.log(rows);
            connection.query('SELECT * FROM messages', function (error, results, fields) {

                if (error) throw error;
                // rows = 1
                rows = results;
                connection.release();
               callback(null, rows);


            });
        });

    }

node.js是异步的,因此您在执行db查询之前返回行。你需要使用回调

function handleDBQuery(err, result) {
    if (err) {


        return;
    }

    // do something with result
}

getHistoryFromDb(handleDBQuery);