繁体   English   中英

如何将字符串转换为可读流?

[英]How do I turn a String into a Readable Stream?

我正在尝试将字符串流式传输到另一个流:

streamer = new stream.Transform objectMode: true
stringer = (string) ->
    streamer._transform = (chunk, encoding, done) ->
        @push string.split('').shift()
        done()

    return streamer

streamer.on 'readable', ->
    console.log 'readable'

stringer('hello').pipe process.stdout

但是控制台中没有任何日志。 我究竟做错了什么?

在 Node 10.x 中,添加了Readable.from便利方法,使这更容易实现。

const Readable = require('stream').Readable;

Readable.from('hello').pipe(process.stdout);

正如您自己所说,您需要的是可读流而不是转换流。 另外你有一个错误,因为string.split('')总是返回相同的数组,然后.shift()将总是返回相同的字母。 重写后的代码如下:

'use strict'

Readable = require('stream').Readable

stringer = (string) ->
  array = string.split('')
  new Readable
    read: (size) ->
      @push array.shift()
      return

readable = stringer('hello')

readable.on 'readable', ->
  console.log 'readable'
  return

readable.pipe process.stdout

这段代码似乎有效。 我不太熟悉您在问题中使用的 ES6 和 ES7 中的所有新 JavaScript 语法,因此我只是从头开始重写了它:

const util=require('util');
const stream=require('stream');

var StringStream=function(strArg){
    stream.Readable.call(this);
    this.str=strArg.split('');
}

util.inherits(StringStream,stream.Readable);

StringStream.prototype._read=function(numRead){
    this.push(this.str.splice(0,numRead).join(''));
}

var thisIsAStringStream=new StringStream('this-is-test-text-1234567890');
thisIsAStringStream.pipe(process.stdout);

在我的系统上它输出this-is-test-text-1234567890 ,所以它工作正常。 这正是文档中推荐的工作方式,通过创建一个使用util.inherit扩展stream.Readable类的类,通过执行stream.Readable.call('this')在新类的构造函数中调用stream.Readable的构造函数stream.Readable.call('this') ,并实现_read方法以使用this.push从字符串中输出字符。

如果不清楚,您可以使用它的方式是使用以下内容创建流:

var helloWorldStream=new StringStream('HelloWorld');

然后您可以像使用任何可读流一样使用该流。

如果您的最终目标是将字符串转换为可读流,只需使用模块into-stream 即可

var intoStream = require('into-stream')
intoStream('my-str').pipe(process.stdout)

另一方面,如果您想知道自己实际执行此操作的方法,则该模块的源代码有点迟钝,因此我将创建一个示例:

(您实际上不需要像代码中那样的转换流,只需要一个可写的流)

var chars = 'my-str'.split('')
  , Stream = require('stream').Readable

new Stream({ read: read }).pipe(process.stdout)

function read(n) {
  this.push(chars.shift())
}

笔记。 这仅适用于 Node 版本 >= 4。以前的版本在Stream构造函数中没有方便的方法。 对于较旧的节点(0.10.x、0.12.x 等),以下稍长的示例将起作用……

var chars = 'my-str'.split('')
  , Stream = require('stream').Readable
  , s = new Stream()

s._read = function (n) {
  this.push(chars.shift())
}

s.pipe(process.stdout)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM