For-each循环等待所有同时运行。使用什么循环?

时间:2019-03-04 06:33:05

标签: javascript node.js discord.js

第一次创建一个不和谐的机器人(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());
        })
    }

2 个答案:

答案 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'));
    }
}

希望这可以澄清(或混淆)某些事情!