gpt4 book ai didi

javascript - 如果我从文件中读取 JSON 数组,那么我会取出旧的未更改的数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:58 24 4
gpt4 key购买 nike

我正在阅读有关require从文件中获取 JSON 对象的内容。我可以正确读取 JSON,但是在向其中添加数据并将其保存到文件中后,重新请求不会获取更新的 JSON,而是检索旧文件。有人可以解释为什么会这样吗?我该如何解决这个问题?

var file = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'] + "\\AppData\\Roaming\\BetterDiscord\\plugins\\Test.json";
var json = require(file);
console.log(JSON.stringify(json.img));
json.img.push({name:"Test"});
console.log(JSON.stringify(json.img));
save(JSON.stringify(json), file);
json = require(file);
console.log(JSON.stringify(json.img));

这是保存方法:

var save = function(value, file){
var fs = require('fs');
fs.writeFile(file, value, function(err) {
if (err) {
console.log(err);
}
});
};

这是输出:

Output 1: [{"name":"A"},{"name":"B"}]
Output 2: [{"name":"A"},{"name":"B"}, {"name":"Test"}]
Output 3: [{"name":"A"},{"name":"B"}]

最佳答案

您的代码有两个主要问题。首先,save 是一个异步函数。这意味着您在完成之后直接编写的任何代码都会在其完成之前运行。在这方面,它的工作原理与 setTimeout 类似。

console.log(1);
setTimeout(function() {
console.log(2);
}, 100);
console.log(3);

注意它如何在 2 之前输出 3。这是因为 setTimeoutfs.writeFile 一样,是异步的。为了确保您在完成后运行代码,您可以传递回调或使用 Promises (超出了这个问题的范围,但非常有用)。所以你的代码可能看起来像这样。

const save = (path, cb) => {
setTimeout(() => {
cb();
}, 100);
};

let path = 'path/to/file';
save(path, () => {
console.log(`Saved ${path}`);
});
console.log(`Saving ${path}...`);

使用 writeFilesync 版本也可以避免这一切。

fs.writeFileSync(file, value);

下一个问题源于 require 如何缓存结果。这样做是因为它旨在加载模块,并且大多数情况下它们不会动态更改。相反,直接从系统加载文件。这也可以异步或同步使用。以下是我如何使用同步代码重写您的代码(尽管异步通常更可取)。

var fs = require('fs');
var save = function(value, file){
return fs.writeFileSync(file, value);
};

var file = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'] + "\\AppData\\Roaming\\BetterDiscord\\plugins\\Test.json";
var obj = JSON.parse(fs.readFileSync(file, 'utf8'));
obj.img.push({name:"Test"});
console.log(JSON.stringify(obj.img));
save(JSON.stringify(obj), file);
obj = JSON.parse(fs.readFileSync(file, 'utf8'));
console.log(JSON.stringify(obj.img));

关于javascript - 如果我从文件中读取 JSON 数组,那么我会取出旧的未更改的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com