process.stdin的end事件如何触发?---关于nod

作者: Yard | 来源:发表于2016-08-04 14:28 被阅读1773次

最近想用js来写一点简单的算法题,node是使用process.stdin和process.stdout来实现标准输入和输出的,我的目标是实现****循环输入****,遇到没有输入时,输入结束。听起来好像很简单,那么接下来我们就来试试。

官方文档

首先我们去看看官方文档

process.stdin

代码如下

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');
});

运行这段程序,接着输入,结果如下,变成了无无限循环的输入,无论怎么输入都无法触发'end'事件

Paste_Image.png

这是为什么呢?
我们继续去查阅官方文档

Paste_Image.png

文档里写着:当完成没有内容输入时就可以触发'end'事件。
看到这里,感觉前面的代码并没有错,那么为什么他不会结束循环输入呢?

我们把代码修改如下:

process.stdin.setEncoding('utf8');

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

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

运行结果如下:

Paste_Image.png

当输入一个字符的时候字符串长度为3,之后都是字符串长度加2,这是什么原因呢?
你还记得你每次输入结束之后都要敲的回车键吗?回车键的字符就是'\n'
知道问题的原因就好解决了,既然加了回车字符,那么我们就将回车字符去掉,最简单的方法当然是切片。

chunk = chunk.slice(0,-2);
Paste_Image.png

现在的数据就没问题了。

原代码修改如下:

process.stdin.setEncoding('utf8');

process.stdin.on('readable', () => {
  var chunk = process.stdin.read();
  if(typeof chunk === 'string'){
    chunk = chunk.slice(0,-2);
    process.stdout.write(`stringLength:${chunk.length}\n`);
  }
  if(chunk === ''){
    process.stdin.emit('end');
    return
  }
  if (chunk !== null) {
    process.stdout.write(`data: ${chunk}\n`);
  }
});

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

就可以做到当没有输入时触发'end'事件。

Paste_Image.png

如果要做字符串处理就在end事件内执行。

相关文章

  • process.stdin的end事件如何触发?---关于nod

    最近想用js来写一点简单的算法题,node是使用process.stdin和process.stdout来实现标准...

  • nodejs 开发websocket 笔记

    使用nodejs 开发websocket消息分发系统 websocket使用事件触发机制传输密集传输数据,跟nod...

  • CocosCreator:TOUCH_END事件的触发时机

    如题,该事件的触发是有一定规律的。 在CocosCreator1.4.2中,节点可以接收四个触摸消息,如下: (官...

  • gulpfile配置,防止报错中断watch server

    参考代码: 1. 报错防止中断 在配置中使用on('error',fn),在fn中打印报错信息,并触发end事件结...

  • dom事件机制

    事件触发三阶段window 往事件触发处传播,遇到注册的捕获事件会触发传播到事件触发处时触发注册的事件从事件触发处...

  • 4.事件源对象

    事件对象是事件触发时关于事件的一些信息 事件源对象是事件对象里面的一部分,表示的是真正触发事件的那个对象 以下面这...

  • 知识小总结五 (事件传递和响应)☀️

    传递链 所谓传递链,是事件触发时,系统如何找到事件触发具体地点 Hit Test (命中测试) iOS使用“命中测...

  • 事件

    事件触发的三个阶段: window 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 ...

  • 浏览器相关知识点小结

    事件机制 事件触发的三个阶段:window 往事件触发处传播,遇到注册的捕获事件会触发传播到事件触发处时触发注册的...

  • 事件

    事件触发方法:onclick="单击触发事件";ondblclick="双击触发事件";onmousedown="...

网友评论

  • 策景:process.stdin.end();
    process.stdin.emit('end');
  • Yard:process.stdin.setEncoding('utf8');

    process.stdin.on('readable', () => {
    var chunk = process.stdin.read();
    if (typeof chunk === 'string') {
    if (process.platform === 'win32') {
    chunk = chunk.slice(0, -2);
    } else {
    chunk = chunk.slice(0, -1);
    }
    process.stdout.write(`stringLength:${chunk.length}\n`);
    }
    if (chunk === '') {
    process.stdin.emit('end');
    return
    }
    if (chunk !== null) {
    process.stdout.write(`data: ${chunk}\n`);
    }
    });

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

    对windows和*nix进行兼容。
  • 17ba8f5aa9aa:然后我用 readable 输出的结果是这个 <Buffer 31 32 0a>
    Yard:@帅的拖网速 收先确认你node的版本吧,node更新快,很多api在更新过程中都在调整,然后具体依照官方文档来。
  • 17ba8f5aa9aa:你好 请问为什么我的这一句代码 会报错 process.stdin.setEncoding('utf8'); 提示setEncoding() 没有这个方法
    策景:没有就buffer.toString('utf8')

本文标题:process.stdin的end事件如何触发?---关于nod

本文链接:https://www.haomeiwen.com/subject/vimcsttx.html