当前位置: 首页 > 面试题库 >

createreadstream是异步的吗?

唐默
2023-03-14
问题内容

https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options。我也有一个一般性的问题。

我是否可以假设,除非文档中另有说明,否则提及的任何函数都是异步的?


问题答案:

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()实际上是一个异步操作,并且异步操作的完成是通过openor
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()是一个具有完成事件的异步操作。但是,由于它与读取文件相结合的方式,您通常不必像它是异步的那样使用它,因为它的异步行为与文件的异步读取相结合。



 类似资料:
  • 我希望我的请求触发一些长时间运行的操作,这些操作应该在后台执行。我编写了以下实现,应该在后台处理我的操作,但实际上我的请求是同步执行的: 在日志中,我看到以下内容: 我看到我的在另一个线程中执行,但出于某种原因,我的原始请求等待sleep完成 更新1:

  • 问题内容: 是功能异步? 问题答案: 不,所有呼叫都是同步的。

  • 问题内容: 我能指望每次调用doSomething()时完成的nodeID映射吗? 我以为node.js中的所有回调都是异步的?我确实读过一篇关于通用编程的文章,说回调可以是同步的,但是我不确定node.js吗? 问题答案: JavaScript也是一种功能编程语言。您在这里拥有的是“高阶函数”,该函数将函数作为参数。高阶函数是同步的(但请参见下面的注释)。 资料来源: 功能编程 JavaScri

  • 我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。 他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下: 如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。 虽然它是同步运行的,

  • 问题内容: 我想知道是否应该在我的网站上使用异步调用。我知道要明确指定我需要使用的 但是起初我尝试使用,尽管服务器必须返回很多信息,但是我的浏览器没有卡死,并且可以毫无问题地导航。 我在网上搜索了一下,但是我仍然不确定100%两者之间的区别。 如果是异步的,那有什么意义呢?如果不是,那么再次看到我的导航没有问题,使用的目的是什么? 提前致谢 问题答案: 是的,是异步的。从文档中: 这是Ajax的简

  • 问题内容: 是在node.js中- 异步?我的意思是javascript代码执行将停止,直到将东西打印在屏幕上,还是将在以后打印? 另外,我有兴趣知道console.log是否有可能在语句崩溃后立即不显示任何内容。 问题答案: 更新: 从Node 0.6开始,此帖子已过时,因为stdout 现在是 同步的 。 好吧,让我们看看实际是什么。 首先,它是控制台模块的一部分: 因此,它只是进行一些格式化