我正在尝试将字符串流式传输到另一个流:
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
但没有任何东西登录控制台。我做错了什么?
答案 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)