2016-10-29 2 views
0
var util = require('util'); 
var ReadableStream = require('stream').Readable; 

function MyReadStream() { 
    ReadableStream.call(this); 
    this._index = 0; 
    this._string = 'Hello World!'; 
} 

util.inherits(MyReadStream, ReadableStream); 

MyReadStream.prototype._read = function() { 
    var i = this._index++; 
    if (i == this._string.length) { 
     this.push(null); 
     this.pipe(process.stdout); 
    } 
    else { 
     var buf = new Buffer(this._string[i], 'utf8'); 
     this.push(buf); 
    } 
}; 

var readerInst = new MyReadStream(); 
readerInst.read(); 

============================================= =Warum Nodejs lesbaren Stream den ersten Buchstaben überspringen?

Warum ich stdout 'ello World!' anstelle von 'Hallo Welt!'

Antwort

0

Was passiert ist, dass die readerInst.read() (was für eine beliebige Anzahl von Bytes fragt) verursacht _read() ausgeführt werden, weil es keine Daten noch zu lesen, so schiebt _read() das erste Zeichen in den Stream, die dann von readerInst.read() zurückgeführt wird. Nachdem dieser Aufruf beendet ist, wird der Rest der Zeichenfolge an den Stream gesendet und wenn das Ende der Zeichenfolge erreicht ist, wird der Inhalt pipeed/in stdout geschrieben, was nur die Zeichenfolge ab dem zweiten Buchstaben zeigt.

Sie können dies überprüfen, indem Sie den Rückgabewert readerInst.read() protokollieren.

+0

Aber warum readerInst._read() bekommen "Hallo Welt"? Vielen Dank . –

+0

Weil die '.push()' bewirkt, dass '._read()' wiederholt aufgerufen wird, bis die highWaterMark erreicht ist, was nie passiert, weil die Stringlänge viel kleiner ist als die standardmäßige highWaterMark. – mscdex

+0

Aber warum nicht 'readerInst._read()' gibt das erste Zeichen als 'readerInst.read()' zurück? Was ist der Unterschied zwischen 'readerInst._read()' und 'readerInst.read()'? –

Verwandte Themen