promise与非阻塞IO的使用问题?

西索酱
  • 148
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的特征是非阻塞,就是一个等待回调的东西就先放着,把其他的事情做了,等回调出来了再执行。
我现在希望实现把某目录下的文件全部做一个读写的行为,有的可能快有的可能慢。我并不会多线程的语言,那如何可以更高效的执行这个动作?

回复
阅读 339
1 个回答

我也不知道你贴的代码出自哪里,本身就存在问题。
do_all_files函数中用的是同步方法readdirSync,且其他都是同步方法,那就没必要将do_all_files申明成异步。

看了网上的promise教程,我并不明白。好像这个是专门用于等上一行跑完才能运行下一行的?这个正常的顺序执行有什么区别?

这个我是没看懂你在问什么。如果是没看懂Promise是什么,那你需要去了解任务机制。

在我印象里,node的特征是非阻塞,就是一个等待回调的东西就先放着,把其他的事情做了,等回调出来了再执行。

这里说的“非阻塞”指的是什么呢?因为你问的是Promise,其实问的就是EcmaScript,但Javascript运行器一般是单线程的,也没有什么阻塞与不阻塞的概念。阻塞说的是IO的事情,这个是NodeJS的libuv调度的,但该阻塞还是会阻塞的。

我现在希望实现把某目录下的文件全部做一个读写的行为,有的可能快有的可能慢。我并不会多线程的语言,那如何可以更高效的执行这个动作?

你没有说清楚,是只读取文件列表,还是要读取列表中的所有文件内容。通常来说,使用方法名后缀不带Sync的方法,就是异步调用,文件IO会交给NodeJS负责,你无需关心。你也可以使用fs/promises,那还会增加任务队列的调度过程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏