не нужны итеративные обратные вызовы - PullRequest
0 голосов
/ 19 апреля 2020

Я пишу бот, используя discord. js, и у меня проблема с функцией обратного вызова. При первом вызове не возникает проблем. обратный вызов вызывается дважды, как если бы это была итеративная функция. Я поставлю код и вывод, чтобы вы могли понять.

async function endRound(carte, channel, players, playersCopy, playersCards) {
    console.log("début endRound");
    let valid = playersCopy.every(player => player.ok == true);
    await addSendingMessages(players, channel);
    await channel.send("phase d'attaque quand vous avez fini envoyer 'ok'");

    emitter.on("ok", message => {
        let playerOk = playersCopy.find(player => player.name === message.author.username);
        playerOk.ok = true;
    });

    emitter.on("attack", async message => {
        console.log("debut callback attack");
        await channel.send(`${message.author.username} attaque ${players[message.content - 1]}`);
        await attack(message.author, players[message.content - 1], carte, channel, playersCards);
        console.log("fin callback attaque");
    });

    while(!valid) {
        await sleep(50);
        valid = playersCopy.every(player => player.ok == true);
    }
    console.log("fin endRound");
}

async function attack(attacker, attacked, carte, channel, playersCards) {
    console.log("debut fonction attaque")
    await channel.send(`${attacked.username} est ce que ${attacker.username} ment ou pas ? réponds par oui ou non`);

    //bug ici
    emitter.on("attackResponse", async message => {
        console.log("debut callback attackResponse");
        if(message.content === "oui") {
            if(contest(carte, attacker, playersCards))
                await channel.send(`${attacker.username} ne ment pas ${attacked.username} boit double`);
            else 
                await channel.send(`${attacker.username} ment il boit double`);
        }
        else {
            await message.channel.send(attacked.username + "boit alors");
        }
        console.log("fin callback attackResponse");
    });
    console.log("fin fonction attaque");
}

function contest(carte, attacker, playersCards) {
    console.log("debut fonction contest");
    let attackerPlayer = playersCards.find(player => player.name === attacker.username);
    let test = attackerPlayer.cards.some(card => card === carte);
    console.log("fin fonction contest");
    return test;
}

выход:

  • дебют endRound
  • дебютная атака обратного вызова
  • атака на дебютную функцию
  • атака на финную связь
  • атака на фин обратного вызова
  • атака на дебютный обратный вызовResponse
  • конкурс на дебютную функцию
  • конкурс на роль фина
  • fin callback attackResponse
  • дебютная атака обратного вызова
  • дебютная атака функции
  • конечная атака fin *
  • атака обратного вызова fin
  • дебют callback attackResponse
  • конкурс дебютных функций
  • конкурс функций fin *
  • дебют callback attackResponse
  • конкурс дебютных функций
  • конкурс функций fin
  • fin callback attackResponse
  • fin callback attackResponse

Почему это происходит?

...