【问题标题】:Function running before the outer one?函数在外层之前运行?
【发布时间】:2016-01-09 04:35:22
【问题描述】:

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

【问题讨论】:

  • 很难理解您需要帮助解决什么问题,但似乎您可能不了解异步操作在 Javascript 中的工作原理。它们稍后完成,但顺序中的其他代码继续运行。如果你想对异步事物进行排序,你不能像在上一个代码块中那样做。
  • @jfriend00 所以没有简单的方法来实现我想要的吗?我的意思是,更新数据库上的 2 条记录,然后运行获取所有数据的函数?
  • 正确的异步编程并不难。如果您在问题中准确描述了您想要完成的工作,我可以写一个答案来说明如何做到这一点。您的问题没有明确说明您的目标是什么 - 它所描述的只是您遇到的一些问题,所以我不确定该针对您的问题推荐什么。而且,试图教授异步编程的整个主题而不关注您的特定问题是一个太大的主题,无法回答。
  • 好的,如您所见,我进行了两次更新以更改用户在数据库中的点,然后我调用函数 updatePoints() 获取数据库上的点并发送给客户端,但似乎该函数在更改之前获取点。我希望它在 UPDATE 查询完成/完成后实际查询数据库。对不起,如果我的解释不好,但我的英语太差了。谢谢先生@jfriend00

标签: javascript node.js socket.io


【解决方案1】:

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 的标准并且在许多库中都可用,promise 的概念也可以用于协调或同步异步操作。你可以在网络上的无数地方阅读更多关于 Promise 的信息。一种介绍性解释是here on MDN

【讨论】:

  • 我有点知道,但我认为更新查询可以足够快地完成......但我没有想到你的解决方案,我相信它会起作用,谢谢!
【解决方案2】:

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

它详细解释了闭包。

【讨论】:

  • 这不是应该的吗?我的意思是,我更新数据库然后调用函数,不应该在更新后调用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2018-05-04
  • 2021-10-16
  • 1970-01-01
  • 2017-04-04
  • 2021-03-31
相关资源
最近更新 更多