Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 变量初始化节点js_Javascript_Node.js_Discord.js - Fatal编程技术网

Javascript 变量初始化节点js

Javascript 变量初始化节点js,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,这是我在这个函数中遇到的问题,我试图返回一个对象数组。当我在forEach循环中执行console.log时,您可以看到数组已填充,但当我尝试在return语句之前打印它时,它是空的。 这是我的完整js文件: const Discord = require("discord.js"); const Maths = require("../Utils/Maths"); const Stop = require("../Commands/stop"); const EventMitter = r

这是我在这个函数中遇到的问题,我试图返回一个对象数组。当我在forEach循环中执行console.log时,您可以看到数组已填充,但当我尝试在return语句之前打印它时,它是空的。

这是我的完整js文件:

const Discord = require("discord.js");
const Maths = require("../Utils/Maths");
const Stop = require("../Commands/stop");
const EventMitter = require("events");
const emitter = new EventMitter();
const fs = require("fs");

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

async function beginMessage(players, channel) {
    let message = "que le jeu commence ";
    players.forEach(player => {
        message += `${player.toString()} `;
    });

    await channel.send(message);
}

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;

        players.forEach(async player => {
            let playerCards = await distributeCards(player, cartes);
            playersCards.push(playerCards);
            //console.log(playersCards);
        });

        console.log(playersCards);
        return playersCards;
    });
}

async function distributeCards(player, cartes) {
    let playerCards = [];

    for(let i = 0; i < 4; i++) {
        let carte = cartes[Maths.getRandomNumber(0,12)];
        carte.count--;
        playerCards.push(carte.name);
    }

    let dmChannel = await player.createDM();
    await dmChannel.send(playerCards);

    return playerCards;
}

module.exports.finishGame = function (client) {
    emitter.emit("stop");
};
const Discord=require(“Discord.js”);
常量数学=需要(../Utils/math”);
const Stop=require(“../Commands/Stop”);
const EventMitter=需要(“事件”);
常量发射器=新的EventMitter();
常数fs=要求(“fs”);
module.exports.play=异步(客户端、频道、播放器)=>{
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]);
试一试{
等待开始消息(玩家、频道);
let playersCards=等待beginGame(客户、玩家);
控制台日志(玩家卡);
发射器.on(“停止”,异步()=>{
等待通道。删除();
控制台日志(“jeu fini”);
});
}
捕获(e){
控制台错误(e);
}    
};
异步函数beginMessage(播放器、频道){
让消息=“que le jeu开始”;
players.forEach(player=>{
message+=`${player.toString()}`;
});
等待通道。发送(消息);
}
异步函数beginGame(客户端、播放器){
让playersCards=[];
fs.readFile(“Utils/cartes.json”,'utf8',async(err,data)=>{
if(err)console.log(err);
让cartes=JSON.parse(数据);
cartes=cartes.cartes;
players.forEach(异步播放器=>{
让玩家卡=等待分发卡(玩家、点菜);
扑克牌。推(扑克牌);
//控制台日志(玩家卡);
});
控制台日志(玩家卡);
返回玩家卡;
});
}
异步函数distributeCards(播放器、点菜){
让playerCards=[];
for(设i=0;i<4;i++){
设carte=cartes[math.getRandomNumber(0,12)];
点菜;
扑克牌(点名);
}
让dmChannel=wait player.createDM();
等待dmChannel.send(播放卡);
返回游戏卡;
}
module.exports.finishGame=函数(客户端){
发射器。发射(“停止”);
};
一定是初始化错误或类似的东西,我一直在我的代码中搜索,但找不到它

编辑3:

由于
fs.readFile
不是异步的,我们需要将其转换为一个承诺的基于函数,如下所示

function readFile(path) {
  return new Promise((resolve, reject) => {
    fs.readFile(path, 'utf8', function (err, data) {
      if (err) {
        reject(err);
      }
      resolve(data);
    });
  });
}
我已经更新了代码沙盒片段。请检查并查看解决您的问题的方法

编辑2:

您需要实现自定义forEach,该forEach将以异步方式执行和返回值。大概是这样的:

async function asyncForEach(array, callback) {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array);
  }
}

不是第一张是带“s”的“玩家卡”,第二张是“玩家卡”,我已经更新了答案。尚未测试代码,但可以检查是否存在任何问题。问题很多,但现在我在这些行代码的开头遇到了另一个问题:let playersCards=wait beginGame(客户机,玩家);控制台日志(玩家卡);playersCards是未定义的,就好像我的beginGame函数不是异步函数一样,wait不能这样使用。您只能在异步函数中使用它您可以执行以下操作
(async()=>{let playersCards=wait beginGame(客户端,玩家);console.log(playersCards);}()您不必粘贴代码的屏幕截图。只粘贴代码就足够了。
async fs.readFile("Utils/cartes.json", 'utf8', async (err, data) => {
    if(err) console.log(err);

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

    await players.forEach(async player => {
        let playerCardsPromiseValue = await distributeCards(player, cartes);
        playersCards.push(playerCardsPromiseValue);
        //console.log(playersCards);
    });

    console.log(playersCards);
    return playersCards;
});