2016-04-09 11 views
2

Ich sah mir diese hübsche geschickte Abschnitt Beispiele auf Streams.Node Readable Stream Leiden

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

Das Beispiel für lesbare sieht aus wie so:

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); 

was mich wirklich verwirrt, ist, dass der Punkt der Ströme ist nicht alles auf einmal im Speicher zu puffern, sowie, um etwas Asynchronität zu liefern, so dass nicht alles über das Piping eines Streams in derselben Runde der Ereignisschleife verarbeitet wird.

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'); 

Aber was ich nicht verstehe ist, wie soll ich die Lesemethode auf lesbar implementieren?

Es scheint, als würde ich komplett anders gelesen als das Beispiel lesen, also scheint etwas aus zu sein.

Wie lese ich Daten mit einem lesbaren Stream manuell ein?

Antwort

0

Nun wusste, dass ich etwas ein bisschen weg war, ich glaube, das auf die kanonische Weise näher ist, dies zu tun:

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); 

ich read ausdrücklich nicht nennen die Entwickler glauben sollte; read soll vom Entwickler implementiert, aber nicht aufgerufen werden. Hoffentlich ist das richtig. Meine einzige Frage ist, warum end nicht im beschreibbaren Stream aufgerufen wurde. Ich wäre auch neugierig, warum das Lesen keinen Rückruf erfordert.