我使用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之前运行,我该如何使它工作?
答案 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?可以帮助你。
它详细解释了闭包。