函数运行在外层之前?

Function running before the outer one?

我在 Node.js 使用 socket.io 这个服务器。 我有一个功能

function updatePoints(){
    pool.getConnection(function(err, connection) {
        connection.query("SELECT * FROM `users`", function(error, rows) {
           //here it fetchs the users' points and emit to their respective sockets
        });
        connection.release();
    });
}

好吧,当我在另一个函数中调用这个函数时,它似乎 运行 在它前面的代码之前。 这里:

function(){
    connection.query('UPDATE `users` SET '...});

    connection.query('UPDATE `users` SET '...});

    updatePoints();
}

第二个功能是当一个用户向另一个用户捐赠积分时,所以我减少捐赠者的积分并增加接收者的积分。 有趣的是,当函数被调用时,它会像我希望的那样为捐赠者发出信号。捐赠者看到他的积分实时更新,而在接收者这边他看不到,除非另一个人第二次给他捐赠积分,然后他看到第一次捐赠正在进行。如果函数在 if should 之前是 运行ning,我怎样才能让它工作?

我不太明白你想说什么,但这似乎是一个闭包问题。 如果是这样的话可能是这个 How do JavaScript closures work? 可以帮到你。

它详细解释了闭包。

connection.query() 是异步的。这意味着调用它只会启动操作,然后在后台运行。同时,Javascript 的下一行立即运行,而 connection.query() 在后台运行。所以,如果你这样做:

connection.query(...);
someFunction();

然后,正如您所发现的,someFunction() 将在 connection.query() 完成之前执行。

解决方案是使用 connection.query() 操作的完成回调对您的工作进行排序,方法是将查询完成后应该发生的任何事情放入回调本身。

 connection.query(..., function(err, rows) {
     // execute some function after the query has completed
     someFunction();
 });

这可以像这样扩展到更多级别:

 connection.query(..., function(err, rows) {
     // execute another query after the first one
     connection.query(..., function(err, moreRows) {
         // execute some function after both queries have completed
         someFunction();
     });
 });
 // code placed right here will execute BEFORE the queries finish

现在是 ES6 的标准并且在许多库中可用,promises 的概念也可以用于协调或同步异步操作。您可以在网络上的无数地方阅读更多关于 promises 的信息。一种介绍性解释是 here on MDN.