计数器值可以不按排序顺序排列吗?

Can counter value be not in sorted order?

我正在尝试了解 node.js 流。由于writer对象方法上的write方法是异步的,counter的值会不会乱?

const writer = fs.createWriteStream(path.resolve("modules", "streams", "hello"));
writer.on("finish", () => console.log("Finished Writing"));
for (let i = 0; i < 1000; i++) writer.write(`Hello:${i}`); // this is async, according to me
writer.end();
console.log("Hello");

Outputs: 
Hello
Finished Writing

不,计数器不会出现故障。 Streams 在您调用 .write() 时将项目插入传出缓冲区,并且您的所有写入都按顺序调用。

但是,像这样的循环需要 writer.write() 上的流量控制,因为如果它 returns false,那么在 drain 之前你不能再写了流上的事件表明有更多的写入空间。有关详细信息,请参阅文档中的 here

write.write() 函数是异步的,但是由于流中的缓冲和其他事件,您不必为每次写入都注册一个完整的回调。 write.write() 将数据放入出站缓冲区,并在数据成功缓冲后立即 returns true 或如果缓冲区中没有空间则立即 returns false缓冲区。

对文件流的实际写入确实是异步的,并且在很大程度上发生在您的视野之外。来自异步部分的错误通过流上的 error 事件传达,并且正如您已经在做的那样,流的完成也通过事件传达。

你在 Hello 之后得到 Finished Writing 的原因是因为幕后的异步写入。您的 for 循环会触发写入,但是当 for 循环完成时它们还没有完成。他们稍后完成(当您看到 finish 事件时)。