2016-04-09 10 views
2

ストリームの例のこのかなり素敵なセクションを見ていました。ノード読み込み可能なストリームの惨事

https://gist.github.com/joyrexus/10026630

そうのような読みやすいルックスのための例:本当に私を混乱させる何

var Readable = require('stream').Readable 
var inherits = require('util').inherits 

function Source(content, options) { 
    Readable.call(this, options) 
    this.content = content 
} 

inherits(Source, Readable) 

Source.prototype._read = function (size) { 
    if (!this.content) this.push(null) 
    else { 
    this.push(this.content.slice(0, size)) 
    this.content = this.content.slice(size) 
    } 
} 

var s = new Source("The quick brown fox jumps over the lazy dog.") 
console.log(s.read(10).toString()) 
console.log(s.read(10).toString()) 
console.log(s.read(10).toString()) 
console.log(s.read(10).toString()) 
console.log(s.read(10).toString()) 

// The quick 
// brown fox 
// jumps over 
// the lazy 
// dog. 


var q = new Source("How now brown cow?") 
q.pipe(process.stdout); 

は、ストリームのポイントは、が一度にメモリにすべてをバッファリングすることではないということですストリームをパイプすることに関するすべてがイベントループの同じターンで処理されるわけではないように、いくつかの非同期性を提供するためにがあります。

const writable = new stream.Writable({ 

     write: function(chunk, encoding, cb){ 

      console.log('data =>', String(chunk)); 

      cb(); 
     } 

    }); 


    var readable = new stream.Readable({ 

     read: function(size){ 

      // what do I do with this? It's required to implement 

     } 
    }); 

    readable.setEncoding('utf8'); 

    readable.on('data', (chunk) => { 
     console.log('got %d bytes of data', chunk.length, String(chunk)); 
    }); 

    readable.pipe(writable); 

    readable.push('line1'); 
    readable.push('line2'); 
    readable.push('line3'); 
    readable.push('line4'); 

しかし、私が理解できないことは、どのようにして読み込み可能な方法で実装するのでしょうか?

私は完全に違った例を読んで実装するようですが、何かが外れているようです。

読み取り可能なストリームでデータを手動で読み込むにはどうすればよいですか?

答えて

0

は、まあ、私は何かが少しオフに知っていた、私は、これはこれを行うための標準的な方法に近いと考えている:

const writable = new stream.Writable({ 

    write: function(chunk, encoding, cb){ 

     console.log('data =>', String(chunk)); 
     cb(); 
    }, 

    end: function(data){ 
     console.log('end was called with data=',data); 
    } 

}); 


var index = 0; 
var dataSource = ['1','2','3']; 

var readable = new stream.Readable({ 

    read: function(size){ 
     var data; 
     if(data = dataSource[index++]){ 
      this.push(data); 
     } 
     else{ 
      this.push(null); 
     } 
    } 

}); 

readable.setEncoding('utf8'); 

readable.on('data', (chunk) => { 
    console.log('got %d bytes of data', chunk.length, String(chunk)); 
}); 


readable.pipe(writable); 

私は、開発者が明示的にreadを呼び出す必要があります信じていません。 readは開発者によって実装されるが、呼び出されることはない。うまくいけば、これは正しいです。私の唯一の質問は、endが書き込み可能なストリームで呼び出されなかった理由です。私は読書がコールバックを取らない理由について興味があります。

関連する問題