JavaScript 文件处理时重新排列

JavaScript rearange when file handeling

我正在尝试从 JSON 文件中读取对象并在其余代码中使用它。 为此,我使用了带有 node.js 的“fs”。 但是好像javascript在最后运行选择的部分。

const fs = require('fs');

let objList = [];

/* vvv Selected Part vvv */
fs.readFile("sample.json", (error, file) => {
    if (error) {
        console.log("ERROR!");
        throw error;
    }

    console.log("here");
    objList.push(JSON.parse(file.toString()));
    console.log("> ", objList);
});
/* ^^^^^^^^^^^ */

console.log(">> ", objList);

输出是:

>>  []
here
>  [ { name: 'name goes here', age: 30 } ]

为什么会发生这种情况,我该如何解决? 另外,有没有更好的实现方式?

您的代码没有任何问题,不是错误

函数 fs.readFile 异步读取文件,这意味着它不会阻塞,所以您的程序会继续,您作为第二个参数传递的函数是一个回调,一旦读取文件完成就会触发。

有几种方法可以处理它: 其中之一是使用 fs.readFileSync 函数,它同步执行相同的操作,这意味着它会停止您的程序,直到读取文件完成。通常不推荐这样做,因为读取文件可能需要时间,最好以 non-blocking 方式进行。 它看起来像

const fs = require('fs');

let objList = [];

const file = fs.readFileSync("sample.json",   {encoding:'utf8'})
objList.push(JSON.parse(file.toString()))
console.log(">> ", objList);

您也可以添加一个 try/catch 块来捕获错误

另一种方法是使用 async 函数和 await 关键字等待您的文件被读取使用 fs.promises 像这样:

const fs = require('fs');

async function myFunc() {
   let objList = [];
   const file = await fs.promises.readFile("sample.json","utf8")
   objList.push(JSON.parse(file.toString()))
   console.log(">> ", objList);
}

myFunc()

它使用了一个 Promise,你可以等到它完成