为循环创建同步Node.JS

时间:2017-11-05 22:14:29

标签: javascript node.js loops asynchronous synchronization

我有以下for循环。它工作正常,除了在继续之前它不等待数据库查询完成的事实。我知道节点是异步的。这就是问题所在。在循环之前,我需要最简单的方法让for循环同步运行。

foreach (int i in b)
{
    a.Remove(i);
}

我的最终目标是浏览var users = guild.members.map(member => member.id) console.log(users.length) for (var i = 0; i < users.length; i++) { console.log(i) connection.query("SELECT serverID, userID FROM serverusers WHERE serverID = ? && userID = ?", [guild.id, users[i]], function (err, result) { console.log(i + ":" + result) if (err) { console.log(colors.red(err.stack)) } if (!result) { connection.query("INSERT INTO serverusers (serverID, userID) VALUES (?, ?)", [guild.id, users[i]]) } }) } 的地图,并检查每个用户是否已经在数据库中。如果用户不是,则添加用户

注意:我使用的是MySQL数据库。

注2:我在网上找到的主要解决方案是使用async库。我查看了它的文档,我无法找出库的哪个部分与for循环一起使用。也许对此的答案可能有助于解决我的问题。

谢谢!

3 个答案:

答案 0 :(得分:0)

修正了它!它不是一个正确的解决方案,但它解决了我的问题。我简单地将我的for循环压缩成一行。这是我的新代码:

var users = guild.members.map(member => member.id)
  console.log(users.length)
  for (var i = 0; i < users.length; i++) {
    connection.query("INSERT IGNORE serverusers (serverID, userID) VALUES (?, ?)", [guild.id, users[i]])
  }

感谢任何人为这篇文章做出贡献:)

答案 1 :(得分:0)

我看到了你的答案,但我认为我会提供一个替代方案,因为我不认为你的答案符合你的期望。

  1. 如果您的异步功能失败(connection.query),那么您将会这样做 永远都不知道。

  2. for循环之后的任何内容都可能在这些用户之前运行 插入

  3. 无论如何,这是我使用承诺的答案。

    &#13;
    &#13;
    function query (statement, params) {
      return new Promise(function (resolve, reject) {
        connection.query(statement, params, function (err, result) {
          if (err) reject(err);
          resolve(result);
        })
      })
    }
    
    var users = guild.members.map(member => member.id);
    var queries = users
      .map(u => query("INSERT IGNORE serverusers (serverID, userID) VALUES (?, ?)", [guild.id, u]);
    
    Promise.all(queries)
      .then(results => console.log('now it\'s done', result));
      .catch(err => console.log('whoopsies', err));
    &#13;
    &#13;
    &#13;

答案 2 :(得分:0)

使用异步库,您可以使用以下方法:

WideCharToMultiByte()

async.each(users, asyncFunctionToDealWithEachUser, callbackForWhenAllUsersHaveBeenProcesssed)

async.each

async.times(users.length, functionToRunForEachUser, callbackForWhenAllUsersHaveBeenProcessed);