2016-10-29 3 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(); 

==================================================================================================================================================================== =Почему nodejs читаемый поток пропускает первую букву?

Почему я получаю stdout 'ello World!' вместо «Hello World!»?

ответ

0

То, что происходит в том, что readerInst.read() (который запрашивает для любого количества байт) вызывает _read() быть выполнен, так как нет никаких данных не читать еще, так _read() толкает первый символ в поток, который затем возвращенный readerInst.read(). После того, как этот вызов завершается, остальная часть строки будет нажата в поток, и когда конец строки будет достигнут, содержимое будет передано/записано в stdout, которое покажет только строку, начинающуюся со второй буквы.

Вы можете проверить это, зарегистрировав возвращаемое значение readerInst.read().

+0

Но почему readerInst._read() получает «Hello World»? Спасибо . –

+0

Потому что '.push()' вызывает '._read()' для вызова повторно до тех пор, пока не будет достигнут highWaterMark, чего никогда не произойдет, потому что длина строки намного меньше, чем значение по умолчанию highWaterMark. – mscdex

+0

Но почему бы не 'readerInst._read()' вернуть первый символ так же, как 'readerInst.read()'? В чем разница между 'readerInst._read()' и 'readerInst.read()'? –

Смежные вопросы