жду заявления не "жди" - PullRequest
       20

жду заявления не "жди"

0 голосов
/ 11 апреля 2020

Итак, у меня есть функция:

module.exports.play = async (client, channel, players) => {
    players.push(client.guilds.cache.first().members.cache.array().filter(mem => mem.user.username === "user1").map(mem => mem.user)[0]);
    players.push(client.guilds.cache.first().members.cache.array().filter(mem => mem.user.username === "users2").map(mem => mem.user)[0]);

    try {
        await beginMessage(players, channel);

        let playersCards = await beginGame(client, players);
        console.log(playersCards);

        emitter.on("stop", async () => {
            await channel.delete();
            console.log("jeu fini");
        });
    }
    catch(e) {
        console.error(e);
    }    
};

, и значение моей переменной 'PlayersCards' печатается до того, как значение возвращается асинхронной c функцией "beginGame". ». Вот код функции beginGame:

async function beginGame(client, players) {
    let playersCards = [];

    fs.readFile("Utils/cartes.json", 'utf8', async (err, data) => {
        if(err) console.log(err);

        let cartes = JSON.parse(data);
        cartes = cartes.cartes;

        await asyncForEach(players, async player => {
            let playerCards = await distributeCards(player, cartes);
            playersCards.push(playerCards);
        });

        return playersCards;
    });
}

Где может быть проблема?

1 Ответ

1 голос
/ 11 апреля 2020

Поскольку beginGame возвращает Promise без значения, потому что fs.readFile принял обратный вызов, который вызывается в другом месте, так что ждать нечего.

async function beginGame(client, players) {
    return new Promise(async (resolve, reject) => {
        let playersCards = [];
        return fs.readFile('Utils/cartes.json', 'utf8', async (err, data) => {
            if (err) return reject(err);

            let cartes = JSON.parse(data);
            cartes = cartes.cartes;

            await asyncForEach(players, async player => {
                let playerCards = await distributeCards(player, cartes);
                playersCards.push(playerCards);
            });

            return resolve(playersCards);
        });
    });
}

это должно работать, так как функция обернута обещанием и есть, что ждать.

...