第一次创建一个不和谐的机器人(discord.js),并陷入我的awaitMessage函数全部同时运行的情况。例如,当我调用该命令时,它将在每个5的循环中执行此操作。
这是什么?你有60秒!
这是什么?你有60秒!
这是什么?你有60秒!
这是什么?你有60秒!
这是什么?你有60秒!
我查看了stackoverflow,发现一个线程在await函数中使用for-of循环可以潜在地解决这种情况,但是我不知道它如何适用于我的代码。谢谢
var i;
for(i = 0; i < 5; i++){
var random = Math.floor((Math.random() * etcList.length));
message.channel.send("What is this item? You have 60 seconds!", {files: ["./pictures/images/img"+(random+1)+".jpg"]});
const filter = m => m.content == (etcList[random].toString()) || (m.content==("skip"));
message.channel.awaitMessages(filter, {max:1, time:60000})
.then(collected => {
if(collected.first().content == ("skip")){
return message.channel.send("This question has been skipped! The answer was: " + etcList[random].toString());
}
if(collected.first().content == (etcList[random].toString())){
message.channel.send(collected.first().author + " has won! The answer was: " + etcList[random].toString());
}
})
.catch(err => {
message.channel.send("Time is up! The answer was: " + etcList[random].toString());
})
}
答案 0 :(得分:1)
代替message.channel.awaitMessages(...).then(...).catch(...)
在for循环中使用它
try {
let collected = await message.channel.awaitMessages(filter, {
max: 1,
time: 60000
});
if (collected.first().content == ("skip")) {
return message.channel.send("This question has been skipped! The answer was: " + etcList[random].toString());
}
if (collected.first().content == (etcList[random].toString())) {
message.channel.send(collected.first().author + " has won! The answer was: " + etcList[random].toString());
}
} catch (e) {
message.channel.send("Time is up! The answer was: " + etcList[random].toString());
}
我们在这里使用await
关键字,它将“等待”功能结果。您应将for循环放置在使用async
关键字定义的函数中
答案 1 :(得分:0)
无需重构代码,您只需在承诺前添加await
并使用async
函数将其包装即可。
这里是Minimal, Complete, and Verifiable example:
async function func() {
var i;
for (i = 0; i < 5; i++) {
await new Promise((res, rej) => {
setTimeout(() => { console.log('x=>'); res() }, 1000)
})
.then(() => console.log('y'));
}
}
希望这可以澄清(或混淆)某些事情!