fga*_*lan 3 node.js node-streams
我有一个 node.js 程序,在其中使用流将信息写入 SFTP 服务器。像这样(简化版):
var conn = new SSHClient();
process.nextTick(function (){
conn.on('ready', function () {
conn.sftp(function (error, sftp) {
var writeStream = sftp.createWriteStream(filename);
...
writeStream.write(line1);
writeStream.write(line2);
writeStream.write(line3);
...
});
}).connect(...);
});
Run Code Online (Sandbox Code Playgroud)
注意我没有使用(可选)回调参数(在write() API 规范中描述),并且我不确定这是否会导致不良行为(即未按以下顺序写入的行:line1、line2、line3) 。换句话说,我不知道是否应该使用这种替代方案(更复杂的代码并且不确定是否效率较低):
writeStream.write(line1, ..., function() {
writeStream.write(line2, ..., function() {
writeStream.write(line3);
});
});
Run Code Online (Sandbox Code Playgroud)
(或使用async series() 的等效替代方案)
根据我的测试经验,我总是按照所需的顺序写入文件(我的意思是,首先是第 1 行,然后是第 2 行,最后是第 3 行)。但是,我现在不知道这是否只是偶然发生,或者上面是使用 write() 的正确方法。
我知道流中的写入通常是异步的(所有 I/O 工作都应该是异步的),但我想知道 Node.js 中的流是否保留内部缓冲区或类似的东西来保持数据有序,因此每个 write() 调用都不会返回直到数据被放入该缓冲区。
在实际程序中使用 write() 的示例非常受欢迎。谢谢!
write() (不带回调)是否保留 Node.js 写入流中的顺序?
是的,它确实。它保留写入该特定流的顺序。您写入的所有数据都会通过流缓冲区进行序列化。
但我想知道node.js 中的流是否保留内部缓冲区或类似的东西来保持数据有序,因此每个 write() 调用在数据放入此缓冲区之前不会返回。
是的,所有数据都会经过流缓冲区。除非发生错误,否则在数据成功复制到缓冲区之前该.write()操作不会返回。
请注意,如果您正在写入大量数据,则可能需要注意流上的流量控制(通常称为背压)。它可以备份,并可能告诉您需要等待才能写入更多内容,但它确实会按照您发送的顺序缓冲您的写入。
如果.write()操作返回false,则流告诉您需要等待该drain事件才能继续写入。您可以在Node.js 文档.write()和这篇有关背压的文章中阅读有关此问题的信息。
您的代码还需要侦听该error事件以检测写入流时的任何错误。由于写入是异步的,因此它们可能会在稍后的某个时间发生,并且不一定反映在回调的返回值.write()或回调err的参数中.write()。您必须侦听该error事件以确保您看到流上的错误。
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |