使用 Node fs 函数的 Javascript 执行顺序



我一直在尝试让以下代码按照我的意愿进行操作。即将1 2 3打印到控制台。

const fs = require('fs');
const doSomthingWithFile = (file, number) => {
fs.readFile(file, () => {
console.log(number);
});
};
fs.readdir('./', (err, files) => {
for (let i = 0; i < files.length; i++) {
doSomthingWithFile(files[i], 1);
}
for (let i = 0; i < files.length; i++) {
doSomthingWithFile(files[i], 2);
}
});
console.log(3);

我一直在尝试使用 async/await 和返回承诺的函数,但我猜我做错了,因为我不断得到3 1 2作为输出。

我将如何确保它都按照我想要的顺序执行。这意味着首先读取目录。然后等到第一个doSomthingWithFile()完成,然后再开始第二个,然后等待最后一个日志语句,直到readdir()回调完成?

就像我说的,我一直试图在这个网站上搜索类似的主题,但仍然无法让它工作。例如,使回调异步函数并等待其中的函数不起作用(或者我一定做错了(。

如果您希望它是同步的,请使用同步方法(fs.readdirSyncfs.readFileSync(。以下是async/await版本:

const fsp = require('fs').promises;
const doSomthingWithFile = async (file, number) => {
await fsp.readFile(file);
console.log(number);
};
(async () => { // ugly async iife since global await is not supported yet
const files = await fsp.readdir('./');
for (let i = 0; i < files.length; i++) {
await doSomthingWithFile(files[i], 1);
}
for (let i = 0; i < files.length; i++) {
await doSomthingWithFile(files[i], 2);
}
console.log(3);
})();

如果你让你的doSomethignWithFile函数返回一个承诺,你可以等待它,这样在上一次迭代解决之前永远不会执行下一次迭代。这样的事情应该有效:

const fs = require('fs');
const doSomthingWithFile = (file, number) => new Promise((resolve, reject) => {
fs.readFile(file, () => {
console.log(number)
resolve()
});
});
fs.readdir('./', async (err, files) => {
for (let i = 0; i < files.length; i++) {
await doSomthingWithFile(files[i], 1);
}
for (let i = 0; i < files.length; i++) {
await doSomthingWithFile(files[i], 2);
}
});

这里发生了什么:

  • 读取目录 异步回调
  • doSomthingWithFile 函数返回一个承诺,该承诺在异步 readFile 函数完成时解析。我们通过在 readFile 函数的回调中调用resolve方法来做到这一点。
  • 等待 doSomthingWithFile 调用的返回。这可确保操作发生的顺序一致。

最新更新