栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

createreadstream是异步的吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

createreadstream是异步的吗?

createreadstream是异步的吗?

是的,没有。这个问题实际上是一个语义问题,而不是任何问题,因为它在同步外观界面下隐藏了一个异步操作。

fs.createReadStream()
似乎具有同步接口。它不会返回承诺或接受回调以在完成时进行回传或发送回一些结果。因此,它从接口看来是同步的。而且,通过使用它,我们知道没有什么要等待就可以开始使用流了。因此,您可以像使用同步接口一样使用它。

这是签名

fs.createReadStream()

fs.createReadStream(path[, options])

而且,在options对象中,没有回调选项,也没有提及返回的promise。这不是典型的异步接口。


另一方面,如果您查看以下签名

fs.rename()

fs.rename(oldPath, newPath, callback)

您会看到它需要一个在文档中称为“完成回调”的回调。该功能显然是异步的。


但是,

fs.createReadStream()
确实会打开文件,并且会异步打开该文件而不会阻塞。

如果您想知道

fs.createReadStream()
必须异步打开文件时如何进行同步,那是因为
fs.createReadStream()
尚未返回文件时尚未打开文件。

在正常使用流时,您可以立即开始从流中读取。但是,在流的内部,如果尚未打开文件,它将等待直到文件完全打开后才真正尝试从文件中读取。因此,打开文件的过程对流的用户是隐藏的(通常是一件好事)。

如果您想知道打开文件的实际时间,则

open
在流上有一个事件。而且,如果打开文件时出错,则
error
流中将有一个事件。因此,如果您想获取技术知识,可以说这
fs.readStream()
实际上是一个异步操作,并且异步操作的完成是通过
open
or
error
事件传达的。

let rstream = fs.createReadStream("temp.txt");rstream.on('open', (fd) => {    // file opened now});rstream.on('error', (err) => {    // error on the stream});

但是,在的正常使用中

fs.createReadStream()
,程序员无需监视文件打开事件,因为它对用户隐藏了,并在从下一个读取流时自动对其进行处理。当您创建读取流并立即要求从中读取数据时(这是一个异步接口),在内部该流对象等待文件完成打开,然后从中读取一些字节,等待文件读取完成然后通知读取操作完成。因此,他们只是将文件打开完成与第一次读取结合起来,从而节省了程序员额外的步骤,即在发出第一次读取操作之前等待文件打开完成。

因此,从技术上讲,这

fs.createReadStream()
是一个具有完成事件的异步操作。但是,由于它与读取文件相结合的方式,您通常不必像它是异步的那样使用它,因为它的异步行为与文件的异步读取相结合。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/392148.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号