【问题标题】:await statement does not "wait"await 语句不会“等待”
【发布时间】:2020-07-23 18:21:45
【问题描述】:

所以我有一个函数是:

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”的值是在异步函数“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;
    });
}

问题可能出在哪里?

【问题讨论】:

    标签: node.js async-await discord.js


    【解决方案1】:

    因为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);
            });
        });
    }
    

    这应该可以工作,因为该函数是用 promise 包装的,并且有一些东西要等待。

    【讨论】:

    • beginGame 是异步的,所以它的返回值默认转换为一个promise。
    • 谢谢它的工作,但正如@VLAZ所说,返回值应该被转换为一个承诺,不是吗?
    • @andrc 它确实。我正在纠正答案的第一句话,因为它具有误导性 - 异步函数 always 返回一个 Promise。但是,由于 beginGame 函数中 的任何位置都没有return,因此它隐式返回undefined,这也变成了Promise。所以你在await 之后实际上永远不会收到任何东西,因为它解析为undefined。有关readFile 和承诺here 的更多信息。似乎有一个 Node API 可以直接为它返回一个 Promise
    • @VLAZ 你是对的,它返回了一个承诺但没有价值,因为 fs.readFIle 有一个回调,我改变了答案。
    • @andrc 如果满足您的要求,您可以接受答案吗?
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2021-08-03
    • 2021-12-11
    • 2016-03-08
    相关资源
    最近更新 更多