我正在尝试实现一个流,该流从每个'数据'事件上的文件返回一个符号。我用代码结束了:
var util = require('util'),
fs = require('fs'),
Readable = require('stream').Readable;
var util = require('util');
var Readable = require('stream').Readable;
var SymbolReadStream = function(filename, options) {
Readable.call(this);
this._readable = fs.createReadStream(filename, options).pause();
self = this;
this._readable.on('readable', function() {
var chunk;
chunk = self._readable.read(1);
// I believe the problem is here
self._readable.pause();
});
};
util.inherits(SymbolReadStream, Readable); // inherit the prototype methods
SymbolReadStream.prototype._read = function() {
this._readable.resume();
};
var r = new SymbolReadStream("test.txt", {
encoding: 'utf8',
});
r.on('data', function(el) {
console.log(el);
});
但是此代码不起作用。请帮忙。是否有一种更简单的方法来实现行为?
这篇文章给出了一个很好的线索如何回答您的问题。
另外,您应该在管道上进行一个循环,这将是完成您尝试做的事情的一种更干净的方法: piping 一个适配器的适配器,而不是包装上
也就是说,个人不会在这里重新发明轮子,只会搜索可以实现这一目标的模块。尤其是"拆分"模块,使它们在每个字符上分开,而是在新线条上。例如,事件流具有一种拆分方法," 采用与字符串相同的参数。plit。因此,逻辑是尝试myStream.pipe(es.split(''))
,但是模块将其类似于myStream.pipe(es.split())
,它会破裂。因此,这是我的解决方案,使用正则说明" break on enver char上"
var es = require('event-stream');
var fs = require('fs');
var symbolStream = fs.createReadStream(filename, options).pipe(es.split(/(?!$)/));
编辑:事件流似乎内部使用拆分模块,因此您甚至可以尝试
var split = require('split');
var fs = require('fs');
var symbolStream = fs.createReadStream(filename, options).pipe(split(/(?!$)/));
(此松散测试负责将''
转换为rn
)
在您的流实现中,没有向Handler发出'数据'事件。因此,console.log
从未被调用。添加事件后,它们将通过符号进行流符号。下面的示例:
var util = require('util'),
fs = require('fs'),
Readable = require('stream').Readable;
function SymbolReadStream(filename, options) {
if (!(this instanceof SymbolReadStream)) {
return new SymbolReadStream(length, options);
}
Readable.call(this);
this._readable = fs.createReadStream(filename, options);
}
util.inherits(SymbolReadStream, Readable); // inherit the prototype methods
SymbolReadStream.prototype._read = function() {
var self = this;
this._readable.on('readable', function() {
var chunk;
while (null !== (chunk = self._readable.read(1))) {
self.emit('data', chunk);
}
});
this._readable.on('end', function() {
self.emit('end');
});
};
var r = new SymbolReadStream("test.txt", {
encoding: 'utf8',
});
r.on('data', function(el) {
console.log(el);
});
r.on('end', function(el) {
console.log('done');
});