【问题标题】:Discord.JS: Wait for multiple replies inside a loopDiscord.JS:在循环中等待多个回复
【发布时间】:2021-07-23 02:43:24
【问题描述】:

我正在尝试在等待客户回复的循环中实现一个函数。

客户端回复后才进入下一次迭代,正好运行3次。

我遇到的问题是,无论何时运行该函数,它都会执行所有三个“承诺”,而无需等待前一个先完成。

我将如何解决这个问题?谢谢。

module.exports = {
    name: 'tournamentwinners',
    description: 'Prepare a pretty message to showcase last tournament\'s winners',
    aliases: ['trwin', 'tournwin'],
    execute(client, message, args) {
        const teamSize = args[0].toLowerCase();
        const firstPlaceTeamMembers = new Array(teamSize);
        const secondPlaceTeamMembers = new Array(teamSize);
        const thirdPlaceTeamMembers = new Array(teamSize);

        const filter = m => m.author.id === message.author.id;
        for (let i = 0; i < 3; i++) {
            message.channel.send(`Which team finished in #${i + 1}? (tag all ${teamSize} people)`).then(() => {
                message.channel.awaitMessages(filter, {
                    max: 1,
                    time: 30000,
                    errors: ['time'],
                })
                    .then(msg => {
                        msg = msg.first();
                        const members = msg.mentions.members.values();

                        for(let j = 0; members.hasNext(); j++) {
                            if(i == 0) {
                                firstPlaceTeamMembers[j] = members.next().value;
                            } else if(i == 1) {
                                secondPlaceTeamMembers[j] = members.next().value;
                            } else {
                                thirdPlaceTeamMembers[j] = members.next().value;
                            }
                        }

                    })
                    .catch(collected => {
                        message.channel.send('Something messed up...');
                    });
            });
        }
    },
};

【问题讨论】:

  • 是否期望每个团队的成员数量相同(所以teamSize只能通过命令确定)?
  • @PerplexingParadox 是的。所有团队成员数量相同,通过命令确定。
  • 我建议你考虑使用MessageCollector

标签: javascript loops asynchronous promise discord.js


【解决方案1】:

要使用then() 语法来做到这一点,它有点笨拙,但我们的想法是构建一个承诺链,将每个承诺附加到前一个。

按照这个表格:

// this function returns a promise to do one iteration of message work
function promiseGeneratingFunction(client, message, args) {
  // it's important to "return" the promise here
  return message.channel.send(/* etc */).then(msg => {
    /* etc */
  })
}

module.exports = {
  name: 'tournamentwinners',
  description: 'Prepare a pretty message to showcase last tournament\'s winners',
  aliases: ['trwin', 'tournwin'],
  execute(client, message, args) {
    let promiseChain = Promise.resolve();
    [ 0, 1, 2].forEach(() => {
      promiseChain = promiseChain.then(() => promiseGeneratingFunction(client, message, args))
    })
    return promiseChain.catch(err => { /* handle error */ })
  }
}

这可以通过使用 async/await 语法稍微简化...

// this function returns a promise to do one iteration of message work
async function promiseGeneratingFunction(client, message, args) {
  // it's important to "return" the promise here
  return message.channel.send(/* etc */).then(msg => {
    /* etc */
  })
}

module.exports = {
  name: 'tournamentwinners',
  description: 'Prepare a pretty message to showcase last tournament\'s winners',
  aliases: ['trwin', 'tournwin'],
  execute(client, message, args) {
    try {
      [ 0, 1, 2].forEach(() => {
        await promiseGeneratingFunction(client, message, args);
      })
    } catch (err) { /* handle error */ })
  }
}

【讨论】:

    【解决方案2】:

    在 for 循环中,你会一个接一个地触发所有的 Promise。 相反,您应该使用 await 关键字。 见:Resolve promises one after another (i.e. in sequence)?

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 2018-12-09
      • 2018-02-02
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 2020-05-24
      相关资源
      最近更新 更多