Javascript 当带有async fs.readdir的递归函数完成执行时,如何获得通知?
如何知道带有异步fs.readdir的递归函数何时完成执行? 这里,完全执行意味着处理给定目录中的所有文件 我尝试返回一个承诺,并使用async/await进行后处理Javascript 当带有async fs.readdir的递归函数完成执行时,如何获得通知?,javascript,node.js,Javascript,Node.js,如何知道带有异步fs.readdir的递归函数何时完成执行? 这里,完全执行意味着处理给定目录中的所有文件 我尝试返回一个承诺,并使用async/await进行后处理 var func = (dirName) => { fs.readdir(dirName, (err, files) => { files.forEach(file => { console.log('Total Size = ' + size);
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
}
})
});
}
您可以将执行包装在承诺中,然后可以等待递归调用被处理,如果使用for of,则可以在函数上下文中停止执行。最后,处理完所有文件后,我们通过通知一切都结束来解决最终承诺
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
记住要处理内部承诺中的错误,我这样做不是为了简化示例谢谢,这很有效。我实际上做了完全相同的事情,但是使用了foreach循环。知道为什么会这样吗?嗨,SSG。当您使用forEach函数时,在每次迭代中,您都在创建一个由forEach的内部函数定义的新上下文,因此,wait指令不在外部上下文(fs.readdir)中,执行不会停止,您正在并行执行内部递归调用。你不能确定全球承诺在内部承诺之后就结束了