簡體   English   中英

制作一個同步的Node.JS for循環

[英]Making a synchronous Node.JS for loop

我有以下for循環。 除了它不等待數據庫查詢完成再繼續運行之外,它還可以正常工作。 我知道該節點是異步的。 這就是問題。 我需要最簡單的方法來使for循環在循環之前一直同步運行。

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]])
      }
    })
  }

我的最終目標是瀏覽users地圖,並檢查每個用戶是否已經在數據庫中。 如果用戶不是,則添加用戶

注意:我正在使用MySQL數據庫。

注2:我在網上找到的主要解決方案是使用異步庫。 我瀏覽了它的文檔,卻找不到該庫的哪個部分用於for循環。 也許對此的答案可能有助於解決我的問題。

謝謝!

修復! 這不是一個適當的解決方案,但仍然可以解決我的問題。 我只是將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. 如果您的異步功能失敗( connection.query ),那么您將永遠不會知道。

  2. for循環之后的所有內容都可能在插入這些用戶之前運行。

無論如何,這是我對諾言的回答。

 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)); 

使用異步庫,您可以使用以下方法:

async.each

async.each(users, asyncFunctionToDealWithEachUser, callbackForWhenAllUsersHaveBeenProcesssed)

要么

異步時間

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM