首页 > 解决方案 > Discord.JS:在循环中等待多个回复

问题描述

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

只有在客户端回复后才进入下一次迭代,并且恰好运行了 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...');
                    });
            });
        }
    },
};

标签: javascriptloopsasynchronouspromisediscord.js

解决方案


在 for 循环中,你会一个接一个地触发所有的 Promise。相反,您应该使用 await 关键字。请参阅:一个接一个地解决承诺(即按顺序)?


推荐阅读