export async function do_all_files(path:string, callback:(path:string)=>void) {
readdirSync(path).forEach(async ele => {
let child = path + "/" + ele;
let info = statSync(child);
if (info.isDirectory()) {
await do_all_files(child,callback);
} else {
await callback(child)
}
});
}
do_all_files(
'D://',
str=>console.log(fs.readFile(str, { encoding:'utf-8'},null))
)
看了网上的promise教程,我并不明白。好像这个是专门用于等上一行跑完才能运行下一行的?这个正常的顺序执行有什么区别?
这让我一直有个错觉,这个东西是为了高效运行的。
在我印象里,node的特征是非阻塞,就是一个等待回调的东西就先放着,把其他的事情做了,等回调出来了再执行。
我现在希望实现把某目录下的文件全部做一个读写的行为,有的可能快有的可能慢。我并不会多线程的语言,那如何可以更高效的执行这个动作?
我也不知道你贴的代码出自哪里,本身就存在问题。
do_all_files
函数中用的是同步方法readdirSync
,且其他都是同步方法,那就没必要将do_all_files
申明成异步。这个我是没看懂你在问什么。如果是没看懂
Promise
是什么,那你需要去了解任务机制。这里说的“非阻塞”指的是什么呢?因为你问的是
Promise
,其实问的就是EcmaScript,但Javascript运行器一般是单线程的,也没有什么阻塞与不阻塞的概念。阻塞说的是IO的事情,这个是NodeJS的libuv调度的,但该阻塞还是会阻塞的。你没有说清楚,是只读取文件列表,还是要读取列表中的所有文件内容。通常来说,使用方法名后缀不带
Sync
的方法,就是异步调用,文件IO会交给NodeJS负责,你无需关心。你也可以使用fs/promises
,那还会增加任务队列的调度过程。