我一直在尝试按照我的意愿执行以下代码。即在控制台上打印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()
回调完成为止。
[就像我说过,我一直试图在这个网站上搜索主要是寻找相似的主题,但是仍然无法使其正常工作。例如,使回调异步函数并等待其内部的函数不起作用(或者我一定做错了)。
如果您使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);
}
});
这里发生了什么:
resolve
方法来做到这一点。 fs.readdirSync
和fs.readFileSync
)。下面是async/await
版本: