我有以下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循环一起使用。也许对此的答案可能有助于解决我的问题。
谢谢!
答案 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)
我看到了你的答案,但我认为我会提供一个替代方案,因为我不认为你的答案符合你的期望。
如果您的异步功能失败(connection.query
),那么您将会这样做
永远都不知道。
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));
&#13;
答案 2 :(得分:0)
使用异步库,您可以使用以下方法:
async.each(users, asyncFunctionToDealWithEachUser, callbackForWhenAllUsersHaveBeenProcesssed)
或
async.times(users.length, functionToRunForEachUser, callbackForWhenAllUsersHaveBeenProcessed);