Док для readableStream.read(size)
говорит,читаемой записи потока не возвращает нуль
если размер байты не доступны, то он будет возвращать нуль.
Чтобы проверить это я сделал:
// in test.js
process.stdin.on('readable', function(){
var d = this.read(30);
if (d) console.log(d.toString());
});
$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node test.js
Выход был следующим:
abc
def
ghi
Я ожидал, что код для печати null
, как size(30)
было больше, чем записанных байтов. Почему он не печатает null
?
Согласно комментариям @ hexacyanide, я переписал код, как показано ниже, и снова запускали тест: выход
process.stdin.on('readable', function() {
var d = this.read(300);
if (d === null) {
console.log("NULL")
} else {
console.log(d.toString());
}
});
process.stdin.on('end', function() {
console.log('END EVENT')
});
Тест:
NULL
NULL
NULL
abc
def
ghi
END EVENT
теперь я могу понять, выход до 3 NULL's
.
После этого у меня есть несколько вопросов, основанных на выходе:
- Почему я получаю
abc\ndef\nghi
как выход для моего первого теста? Я спрашиваю об этом, потому что даже после нажатияabcdefghi
на поток длина его буфера равна 9. Поэтому, если я прочитал какое-либо время, операция чтения должна вернутьnull
. Разумеется, я установил размер чтения в 300. - Как поток знает, что я выполнил все мои нажатия?
Есть ли у вас код для отображения? Используя вашу настройку, я провел несколько тестов, а 'd' -« null », как и ожидалось. Обратите внимание, что вы не должны ожидать, что 'null' будет напечатан, из-за вашего оператора' if'. Протестировано на NodeJS 'v0.10.16'. – hexacyanide
вы должны проверить на 'null', используя' if (d === null) ' – vinayr
@hexacyanide, я обновил вопрос в соответствии с вашими комментариями. Пожалуйста, взгляните на это. vinayr, Спасибо за ваш совет, я также включил ваш нулевой код проверки в обновленный вопрос – rajkamal