nodejs で標準入力から読み込むには複数の方法がありますが
(fs
の readFileSync
で /dev/stdin
から読むとか、readline
モジュールで読み込むとか)
Promise
で process.stdin
による実装を試してみました:
function read() {
return new Promise((resolve, reject) => {
let buffer = '';
process.stdin
.resume()
.setEncoding('utf8')
.on('readable', () => {
while ((chunk = process.stdin.read()) !== null) {
buffer += chunk;
}
})
.on('end', () => resolve(buffer));
});
};
使うときは async
await
でこうです:
function doSomething(input) {
console.log(input);
}
(async () => {
const input = await read();
doSomething(input);
})();
コールバックよりはマシかな程度になりましたね。
バッファに全部読み込むのではなく
ジェネレーターで行ごとに返せたりできれば
そっちのほうがいいなと感じますね。