【问题标题】:What is the ".on" in "process.stdin.on" for?“process.stdin.on”中的“.on”是干什么用的?
【发布时间】:2017-05-30 01:55:30
【问题描述】:

我在 Node.js 网站上,我从朋友那里得到了一些包含“stdin”的示例代码。 我去搜索什么是标准输入,我现在知道了。 虽然,在 Node.js 的网站上,他们使用“stdin.on”。

我找不到任何关于它的信息。也许有人可以填写我?! :)

process.stdin.setEncoding('utf8');

process.stdin.on('readable', () => {
  var chunk = process.stdin.read();
  if (chunk !== null) {
    process.stdout.write(`data: ${chunk}`);
  }
});

process.stdin.on('end', () => {
  process.stdout.write('end');
});

我希望有人可以在非专家级别上向我解释这一点。

【问题讨论】:

  • @JohnSlegers,我会在一秒钟内阅读网页,但它并没有真正回答我的问题。我已经“扫描”了该页面,但找不到任何关于“.on”附加组件的信息。有什么我遗漏的东西,还是打算给我一些背景信息:)。编辑:感谢您尽快回复
  • @KrzysztofSafjanowski,我在屏幕顶部弹出了相同的选项。在我问我的问题之前,我检查了那个页面。虽然我无法弄清楚。可能是因为我是编程新手。 :) 编辑:我也特别要求“.on”。这不是那个问题的人所问的。我试图了解“.on”和“.once”等的目的是什么

标签: node.js stdin


【解决方案1】:

不确定这个问题还需要另一个答案,但很简单,process.stdin.on(); (如上所述)只是一个侦听器 - 它正在侦听一个“数据”事件,当用户在键盘上按“输入”时触发该事件。当.on() 听到该事件时,您可以通过提供回调来做一些事情。在幕后,Node 会将用户输入传递给您的回调。

这是一个非常简单的例子:

// Listen for the 'data' event, then call myCallback...
process.stdin.on('data', myCallback);

let myCallback = (userInput) => {
// In Node the userInput is a Buffer class instance, so .toString() it
// It also comes with a new line character, so let's trim it off         
let input = userInput.toString().trim();
// Now do whatever you want with the userInput...
};

通常你也会编写一个发射器来触发你正在监听的事件,比如:

myEmitter.emit('myEvent', 'The event happened!');

但您不需要 - 在这种情况下,只要您在键盘上点击“输入”,Node 就会为您发出事件。你所做的就是用.on() 收听它,然后做一些回应。

【讨论】:

    【解决方案2】:

    process.stdin 属性返回一个连接到标准输入的net.Socket Stream^

    它从stream.Duplex 扩展而来,使其既可读又可写。 ^

    所有流都是EventEmitter 的实例。 ^

    现在我们了解了这一点,让我们看看您可以在process.stdin 中找到什么。

    .addListener(eventName, listener)^

    • .on(eventName, listener) 的别名

    .on(eventName, listener)^

    • listener 函数添加到名为eventName 的事件的侦听器数组的末尾

    .once(eventName, listener)^

    • 为名为@9​​87654342@ 的事件添加一次性listener 函数。下次触发eventName 时,会删除此listener,然后调用。

    .off(eventName, listener)^

    • 从名为eventName 的事件的侦听器数组中删除指定的listener

    .removeListener(eventName, listener)^

    • .off(eventName, listener) 的别名

    这意味着您可以附加“侦听器”,这些侦听器执行操作以响应标准输入发出的各种事件。

    例如,当用户按下一个键时。类似于onClick="myFunction()"属性、object.onclickjQuery.on('click')等DOM事件。

    【讨论】:

      【解决方案3】:

      .on() 用于监听事件。这就像在 HTML 按钮上监听 click 事件。实际上 jQuery 在 DOM 事件中的用法完全一样。

      【讨论】:

        【解决方案4】:

        我自己最近一直在为同样的问题苦苦挣扎,经过一番挖掘后,我发现根据Node.Js documentation

        process 对象是EventEmitter 的一个实例

        如果您访问 EventEmitter documentation,您可以在此处找到有关 API 和 on 功能的更多信息:

        将侦听器函数添加到名为 eventName 的事件的侦听器数组的末尾。不检查是否已添加侦听器。传递相同 eventName 和 listener 组合的多次调用将导致 listener 被多次添加和调用。

        在我的例子中,它正在查看 Node 的 TypeScript 定义文件,并使用以下 API 方法引导我走上这条路:

        export class EventEmitter {
            addListener(event: string | symbol, listener: Function): this;
            // Here is it
            on(event: string | symbol, listener: Function): this;
            once(event: string | symbol, listener: Function): this;
            removeListener(event: string | symbol, listener: Function): this;
            removeAllListeners(event?: string | symbol): this;
            setMaxListeners(n: number): this;
            getMaxListeners(): number;
            listeners(event: string | symbol): Function[];
            emit(event: string | symbol, ...args: any[]): boolean;
            listenerCount(type: string | symbol): number;
            // Added in Node 6...
            prependListener(event: string | symbol, listener: Function): this;
            prependOnceListener(event: string | symbol, listener: Function): this;
            eventNames(): (string | symbol)[];
        }
        

        【讨论】:

        • 感谢您的回答!我有几件事让我无法理解我想知道的东西。因为我不是英国人,所以我什至不知道 emit 的确切翻译(这让我很难理解)。而且我在编程时从未使用过“听众”这个词。之后,我再次阅读了您的帖子,第一部分很有意义。第二部分......我不知道发生了什么......无论如何谢谢:)
        • 没问题,很高兴我可以拯救其他人,因为我不必经历我为找到 on 的确切位置而经历的痛苦!
        • 是的,在阅读了带有“on”和“once”的部分后,我意识到它的用途并经过一些实验......我得到了它的工作! :) 编辑:我只是不喜欢使用我不理解的代码...:/
        • 对“它在哪里”和“它是干什么用的”有轻微的误解和混淆。
        猜你喜欢
        • 2019-06-15
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 2017-11-03
        • 2014-12-20
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多