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

时间:2016-02-19 23:18:33

标签: node.js coffeescript

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

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

但没有任何东西登录控制台。我做错了什么?

4 个答案:

答案 0 :(得分:4)

在节点10.x中,添加了revealingSplashView便捷方法,使此操作更容易实现。

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

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

答案 1 :(得分:3)

您所说的自己是一个可读的流而不是转换流。此外,您有一个错误,因为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

答案 2 :(得分:1)

此代码似乎有效。我对你在问题中使用的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,因此它正常工作。这与documentation中的推荐方式完全相同 ,通过使用stream.Readable创建扩展util.inherit类的类,通过执行stream.Readable在新类的构造函数内调用stream.Readable.call('this')的构造函数,并实现{ {1}}使用_read从字符串输出字符的方法。

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

this.push

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

答案 3 :(得分:1)

如果您的最终目标是将字符串转换为可读流,只需使用模块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)