功能在外部运行之前运行?

时间:2016-01-09 04:35:22

标签: javascript node.js socket.io

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

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之前运行,我该如何使它工作?

2 个答案:

答案 0 :(得分:1)

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

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的概念也可用于协调或同步异步操作。您可以在网上数十万个地方阅读更多有关承诺的信息。一个介绍性的解释是here on MDN

答案 1 :(得分:0)

我真的不明白你想说什么,但这似乎是一个关闭问题。 如果是这种情况可能就是这样 How do JavaScript closures work?可以帮助你。

它详细解释了闭包。