函数运行在外层之前?
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.
我在 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.