[英]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.