Javascript全局变量未设置为所需值

Javascript全局变量未设置为所需值,javascript,Javascript,好的,我认为这与作用域有关,但我对javascript相当陌生。在数据库查询totalSum的函数内部有一个值,但当我在函数外部请求该值时,它表示为0。有人能帮我吗 socket.on('sumDoughnut', function(data){ var totalSum = 0; mysqlConnection.query('SELECT SUM(value) AS Total FROM doughnut', function(err, row, results

好的,我认为这与作用域有关,但我对javascript相当陌生。在数据库查询totalSum的函数内部有一个值,但当我在函数外部请求该值时,它表示为0。有人能帮我吗

 socket.on('sumDoughnut', function(data){

    var totalSum = 0;


        mysqlConnection.query('SELECT SUM(value) AS Total FROM doughnut', function(err, row, results){
                    if(err) {io.to(socket.id).emit('err_client', { code : 22 });console.log("MySQL error: " + err);if(err.code === 'PROTOCOL_CONNECTION_LOST'){handleDisconnect();}}
                    totalSum = row[0].Total;
                    console.log("here it is " + totalSum);
                });

        console.log(totalSum + " totalSum")
    }

正如评论中提到的,范围是正确的。问题是对
控制台的调用。日志应该在回调中,而不是在外部

如果不将其放入回调中,则
console.log
调用将在数据库调用后立即执行,而不是等待数据库的响应。DB返回值后,将立即触发回调

这将解决它:

socket.on('sumDoughnut', function(data){
    var totalSum = 0;

    mysqlConnection.query('SELECT SUM(value) AS Total FROM doughnut', function(err, row, results){
        if(err) {io.to(socket.id).emit('err_client', { code : 22 });console.log("MySQL error: " + err);if(err.code === 'PROTOCOL_CONNECTION_LOST'){handleDisconnect();}}

        totalSum = row[0].Total;
        console.log(totalSum + " totalSum")
    });
}

尝试定义
var totalSum=0
sumDoughnut
event之外这是一个时间问题。查询回调是异步的,因此在执行第二个
console.log()
语句很久之后才会执行。任何希望使用新的
totalSum
值的代码都应该在回调内,而不是在回调后。@Nick您需要在收到回调后使用它。。。。你不能在比萨饼送达之前就吃了它,是吗?这就是异步代码在Javascript中的工作方式。您可以将使用
totalSum
的代码放在回调中,这样就可以在提供值的地方使用该值。或者,您可以从回调函数中调用函数,并将该值传递给函数。它在其他任何地方都不可用。这就是异步编程在Javascript中的工作方式。抵抗是徒劳的!使用承诺而不是简单的回调进行编程使代码的编写更加愉快,并使错误处理更加容易。@Jonathan实际上我是从escaparrello那里偷来的(不确定拼写)。。。但它确实用了明显的外行术语