使用Node fs函数的Java脚本执行顺序

问题描述 投票:0回答:2

我一直在尝试按照我的意愿执行以下代码。即在控制台上打印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和返回promise的函数,但是我猜我在做错了所有事情,因为我不断获得3 1 2作为输出。

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

[就像我说过,我一直试图在这个网站上搜索主要是寻找相似的主题,但是仍然无法使其正常工作。例如,使回调异步函数并等待其内部的函数不起作用(或者我一定做错了)。

javascript promise async-await
2个回答
0
投票

如果您使doSomethignWithFile函数返回一个Promise,则可以等待它,以便将执行下一次迭代,直到上一个解决为止。这样的事情应该工作: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); } });

这里发生了什么:

    readdir回调使异步
  • doSomthingWithFile函数返回一个承诺,该承诺将在异步readFile函数完成时解决。我们通过在readFile函数的回调中调用resolve方法来做到这一点。
  • 等待doSomthingWithFile调用的返回。这样可以确保操作顺序一致。

0
投票
如果要使其同步,请使用同步方法(fs.readdirSyncfs.readFileSync)。下面是async/await版本:
© www.soinside.com 2019 - 2024. All rights reserved.