如何在与异步fs.readdir递归函数执行完毕得到通知?
我怎么知道当异步fs.readdir递归函数执行完成?这里完整的执行意味着在指定目录中的所有文件进行处理。
我试图返回一个承诺,后期处理也采用异步/等待。
var func = (dirName) => {
fs.readdir(dirName, (err, files) => {
files.forEach(file => {
console.log('Total Size = ' + size);
console.log('Size Processed = ' + fileSizeProcessed);
console.log('Processing : ' + file);
var currentDir = path.join(dirName, file).toString();
if ((fs.statSync((currentDir)).isDirectory())) {
func(currentDir);
}
else {
//Process File
}
})
});
}
回答如下:
你可以用在承诺的执行,然后你可以等待递归调用进行处理,停止在该功能的情况下执行,如果你使用了的。最后,一旦所有的文件进行处理,我们将通知一切都结束了解决的最终承诺。
const fs = require('fs')
const path = require('path')
const walk = dirName => {
return new Promise((resolve, reject) => {
fs.readdir(dirName, async (err, files) => {
if (err) {
return reject(err)
}
for (const file of files) {
console.log(`Processing : ${file}`)
const currentDir = path.join(dirName, file)
if ((fs.statSync((currentDir)).isDirectory())) {
await walk(currentDir)
} else {
console.log(`File ${file} processed`)
}
}
resolve(`Folder ${dirName} processed, work finished`)
})
})
}
walk('./walk').then(response => console.log(response))
例如,在下面的目录结构:
如果执行上面的代码,输出如下:
Processing : file1.txt
File file1.txt processed
Processing : file2.txt
File file2.txt processed
Processing : file3.txt
File file3.txt processed
Processing : walk-sub1
Processing : walk-sub1-1
Processing : walk-sub1-1-file1.txt
File walk-sub1-1-file1.txt processed
Processing : walk-sub1-file1.txt
File walk-sub1-file1.txt processed
Processing : walk-sub1-file2.txt
File walk-sub1-file2.txt processed
Processing : walk-sub2
Processing : walk-sub2-file1.txt
File walk-sub2-file1.txt processed
Folder ./walk processed, work finished
请记住,应对内部承诺的错误,我没有做到这一点,以简化的例子