Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Получение данных из потока

#javascript #nodejs


Приветствую. 
Пытаюсь получить данные из потока.

process.stdin.setEncoding('utf8');

process.stdin.on('readable', () => {
    let chunk = String(process.stdin.read());
    console.log(chunk);
});


Мне возвращается 

Input:
10 2
Your output:
10 2
null


Как избавиться от null?
    


Ответы

Ответ 1



Как вариант, проверить, что process.stdin.read() вернул что-то полезное (не null). Естественно, проверить надо до каста к строке, а не после. Примерно так: process.stdin.on('readable', () => { var chunk = process.stdin.read(); if (!chunk) { return; } chunk = "" + chunk; console.log(chunk); });

Ответ 2



Почему это происходит? Событие readable выбрасывается не только в случае, когда доступна новая порция данных, но и когда достигнут конец потока: Вот что об этом сказано в официальной документации: The 'readable' event will also be emitted once the end of the stream data has been reached but before the 'end' event is emitted. Далее, если вы пытаетесь читать из потока после того, как достигнут конец потока, метод stream.read вернет null. Позволю себе снова процитировать документацию документацию: Note: Calling stream.read([size]) after the 'end' event has been emitted will return null. No runtime error will be raised. Иными словами, возврат null - это штатное поведение readable-потока. Что делать? Тут есть сразу несколько вариантов: Метод stream.read возвращает null только в одном случае. Вы можете в явном виде проверять результат stream.read на это значение: process.stdin.on('readable', () => { let chunk = process.stdin.read(); if (null !== chunk) { console.log(chunk.toString()); } }); Можно использовать поток в другом (flowing) режиме и получать данные по событию data: process.stdin.on('data', (chunk) => { console.log(chunk.toString()); });

Комментариев нет:

Отправить комментарий