Javascript 变量初始化节点js
这是我在这个函数中遇到的问题,我试图返回一个对象数组。当我在forEach循环中执行console.log时,您可以看到数组已填充,但当我尝试在return语句之前打印它时,它是空的。 这是我的完整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
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;
});