はじめてのReadableStream(stream2)
stream2のReadableStreamを書いてみました。
var stream = require('stream'), util = require('util'); function SpecialStream(options) { options || (options = {}); options.objectMode = true; stream.Readable.call(this, options); this.count = 0; } util.inherits(SpecialStream, stream.Readable); SpecialStream.prototype._read = function(size) { this.add_(this.count++ + ': ' + String(Math.random()) + '\n'); if (this.count > 30000) { this.push('size: ' + String(size) + '\n'); this.push(null); } }; SpecialStream.prototype.add_ = function(val) { var that = this; !this.push(val) && setImmediate(function() { that.add_(val); }); }; var aaa = new SpecialStream(); aaa.pipe(process.stdout);
うーん、一応書いてみたけど……よくわからない。
stream1の時もそうだったけど、結局なにを実装すればいいのか全然わかんない。
pipeでは動くんだけど、EventEmitterスタイルでやると全然動かないんだこれが。
今までのdataイベントをそのままreadableイベントでemitしてあげるといいのかな?
追記:
--- index.js 2013-03-14 11:27:44.913590356 +0900 +++ index2.js 2013-03-14 11:28:00.673524659 +0900 @@ -30,4 +30,9 @@ var aaa = new SpecialStream(); -aaa.pipe(process.stdout); +aaa.on('readable', function() { + var buf; + while ((buf = aaa.read(1)) !== null) { + process.stdout.write(buf); + } +});
こうですか先生わかりません(><)
一応pipeしたときみたいには動いたけど……