清空数组后,代码没有读取到它是空的

Posted

技术标签:

【中文标题】清空数组后,代码没有读取到它是空的【英文标题】:After Emptying an Array, the Code Isn't Reading That It's Empty 【发布时间】:2021-04-09 15:40:57 【问题描述】:

我正在尝试将临时信息发送到一个 json 文件,我可以在其中将它们存储为对象数组,然后在一段时间后自动将文件重置为空数组。

代码起初读得很好并存储了信息,但是一旦它设置回一个空数组,代码就不再读取它是空的,并且仍然在不应该做的事情。当使用下面的 join 命令时,它应该检查它是否为空,如果是则返回并且不存储任何东西,直到那里首先有敌人。 “用户加入战斗”的响应仍然发生,并且数组中没有存储任何内容。

这是连接命令

const Discord = require('discord.js');
const fs = require('fs');

const enemySpawn = require('../EnemySpawn.json');
const  rpgbot  = require('../colors.json');

module.exports = 
    name: 'join',
    description: 'Used to join the grouping of players to fight an enemy that spawns',
    execute(message, args) 
        if (enemySpawn.length == 0) return message.channel.send('There\'s no enemy to fight!');
        if (enemySpawn.some(user => user.id === message.author.id)) return message.channel.send('You already joined the current fight!');

        // TODO add users stats 
        enemySpawn.push(
            name: message.author.username,
            id: message.author.id
        )

        fs.writeFile('./EnemySpawn.json', JSON.stringify(enemySpawn), err => 
            if (err) console.error(err);
        );

        // TODO add current level of the user
        const embed = new Discord.MessageEmbed()
        .setColor(rpgbot)
        .addField(`$message.author.username joined the fight!`, '\u200B')

        message.channel.send(embed);
    ,
;

这里是先获取敌人并储存的功能

const fs = require('fs');

const enemySpawn = require('./EnemySpawn.json');
const enemies = require('./Enemies.json')

getEnemy: function (message) 
        if (!(enemySpawn.length == 0)) return;

        let randomEnemy = enemies[Math.floor(Math.random() * enemies.length)];

        enemySpawn.push(
            enemy: randomEnemy.name,
            health: randomEnemy.health
        )

        fs.writeFile('./EnemySpawn.json', JSON.stringify(enemySpawn), err => 
            if (err) console.error(err);
        );

        message.channel.send(`Watch out! A $randomEnemy.name appeared!`);
    

这里是当有人发送一条消息时调用它的地方,该消息还具有超时功能,可在 3 秒后清除数组以进行测试

const fs = require('fs');

const functions = require('./functions.js');

let used = false;

if (!used) 
        functions.getEnemy(message);
        used = true;
        setTimeout(function () 
            used = false;
            fs.writeFile('./EnemySpawn.json', JSON.stringify([]), err => 
                if (err) console.error(err);
            );
        , 3000);
    

【问题讨论】:

考虑重新编写问题,只关注问题。抽象出不必要的代码,关注不为空的数组。 【参考方案1】:

我看到你阅读 json 文件的唯一地方是:

const enemySpawn = require('../EnemySpawn.json');

这两个都在模块初始化中,只会在启动时执行一次。因此,在将空数组写回文件后,您永远不会再将其读回(除非您重新启动服务器)。

如果您希望再次读回该空数组,则必须在某些操作期间再次实时读取该 JSON 文件。

【讨论】:

所以你是说我必须把它放在每次调用函数时读取的实际函数中,而不是把它作为初始化? @QuazArxx - 如果您要做的是在执行函数之前获取文件的最新内容,那么是的,您需要在函数内读取文件的最新内容。我完全不清楚为什么不将此信息存储在模块级变量中并共享它。为什么你必须不断地读取和写入文件? 这似乎是一种存储对象的简单方法,因此我可以获取信息以供以后使用其他功能。特别是因为我的命令“join”存储在一个单独的文件夹中,并将其全部发送到一个文件似乎是要走的路。 @QuazArxx - node.js 的模块设计使您可以轻松地拥有一个“拥有”数组并导出它的模块。任何其他想要使用该数组的模块都可以导入它。只要您只是修改现有数组并且不为其分配一个新的、单独的数组,原始数组的所有持有者都会看到对它的所有修改(真正的数据共享)。如果需要,您可以读取/写入文件,但不必仅在几个模块之间共享数据。当您需要在服务器崩溃或重启时保持数据持久性时,您应该使用文件系统。 我以前使用过这种方法来存储不断读取和更新的信息,直到现在清空它之前我从来没有遇到过问题。我有一个使用完全相同的方式的级别系统和货币系统。我想我可以继续使用同样的方法,除了一个临时数组会改变它的内容。

以上是关于清空数组后,代码没有读取到它是空的的主要内容,如果未能解决你的问题,请参考以下文章

异步后如何使全局数组不为空

地图函数内的数组似乎接收数据,地图外它是空的

Angular 2 + Ionic 2:对象推送到数组,但是当我尝试使用它时它是空的

js中清空数组的方法

WSO2 - 如何让调用中介忽略有效负载(比如它是空的,甚至不是空的)?

如何检查扫描字符串的第一个字符,即使它是空的?