首页 > 解决方案 > 事件难度

问题描述

我很难理解这些事件。每当我看到带有事件的代码示例时,我都找不到它们的文档,只能理解测试。例如,在这段代码中,我通过测试理解了“SIGINT”,但我没有找到文档。“结束”我找不到文档,我也无法理解“结束”何时会被解雇。这些事件会发生什么?为什么查找文档这么麻烦?事件是上下文相关的吗?如何知道上下文以及在哪里搜索?谢谢你,很抱歉这个愚蠢的问题。

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', inputStdin => { inputString
    inputString += inputStdin;
});

process.stdin.on('end', function() {
    inputString = inputString.replace(/\s*$/, '')
        .split('\n')
        .map(str => str.replace(/\s*$/, ''));

    main();
});

标签: javascriptnode.jsevents

解决方案


这是流的文档:https ://millermedeiros.github.io/mdoc/examples/node_api/doc/streams.html

可以看到stdin是一个Stream:https ://nodejs.org/api/process.html#process_process_stdin

因此,无论适用于 Stream,也适用于标准输入。

数据事件:

如果使用了 setEncoding(),则 'data' 事件会发出 Buffer(默认情况下)或字符串。

因此,数据事件正在将数据块从 Stream 加载到 Buffer 或字符串中。

结束事件:

当流接收到 EOF(TCP 术语中的 FIN)时发出。表示不会再发生“数据”事件。如果流也是可写的,则可以继续写。

因此,当最后一个数据事件发生时,就会触发结束事件。

为了解释这一点,假设您有一个大小为 2 GB 的文件流。在这种情况下,从该文件加载数据块,假设块的大小为 S。在这种情况下,您将有大约 2 GB / S 的加载步骤。这意味着会有很多数据事件,并且系统总是会在有下一个要加载的数据包时触发数据事件。最后,当没有更多要加载的内容时,它会触发结束事件。既然我们了解了 Streams,我想你现在明白了 stdin 也会发生同样的事情。没有什么能阻止标准输入突然收到大量数据的可能性。


推荐阅读