【发布时间】:2015-01-07 14:51:49
【问题描述】:
我正在实现一个带有异步操作的转换流。我的叫Parser。
var Transform = require('stream').transform;
function Parser(options) {
Transform.call(this, {objectMode: true});
}
Parser.prototype._transform = function _transform(input, encoding, callback) {
var this_ = this;
doSomethingAsync(input, function(output) {
this_.push(output);
//possible location #1 for callback();
});
//possible location #2 for callback();
}
每个传入的块可能需要很长时间来处理(doSomethingAsync 需要网络请求)。但是,每个块的处理完全独立于之前的块。此外,输出的确切顺序并不重要。每个输出都包含一个描述符,用于标识其输入,而不是按顺序标识。
因此,我希望尽快再次调用_transform,而不是等到给定块完全完成处理。所以,看看代码,如果我把callback() 放在possible location #1 中,那么在每个块被完全处理之前,_transform 永远不会被调用。但是如果我把它放在possible location #2中,那么我的流在回调之后推送,导致这些难看
Uncaught Error: stream.push() after EOF
流终止时出错。
所以我的问题是:是否可以使用转换流来做到这一点?还是我应该考虑使用图书馆?如果有,是哪种类型(事件流、FRP 等)?
谢谢。
【问题讨论】: