2017-01-27 3 views
0

node.jsには、readlineのように、stdinから正確な1行を読み取り、文字列を返すなどの機能がありますか?一度に1行を読み込んでNodeJSの変数に割り当てる方法は?

let a = parseInt(readline(stdin)); 
let b = parseFloat(readline(stdin)); 

私はラインのブロック全体を読み、process.stdin.on("data")またはrl.on("line")を使用してのように、行ごとにそれを解析したくありません。

http://stackoverflow.com/questions/20086849/how-to-read-from-stdin-line-by-line-in-nodeで提供されている回答では、すべての行が同じ機能ブロックで処理されていますが、行を読み込む際に各行を変数に割り当てることはできません。

var readline = require('readline'); 
var rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    terminal: false 
}); 
rl.on('line', function(line){ 
    console.log(line); 
}) 
+0

これは何か?どういう意味ですか ? –

+0

私は私の質問を改訂しました。今はあいまいではないでしょうか。 –

+2

[ノード内の行ごとにstdin行を読み込む方法](http://stackoverflow.com/questions/20086849/how-to-read-from-stdin-line-by-line-in-node) – bonesbrigade

答えて

1

ストリームから行を読み取ることは、とにかく非同期操作になることは明らかです。 (実際にストリームにストリームが現れたときはわからないので)。だからあなたはコールバック/約束か発電機のどちらかを扱うべきです。そして読み込みが起こったときには、ラインを取得します(コールバックで、.thenで返された値として、または単にジェネレータを使用する場合は変数に割り当てます)。

あなたがES6を使用して、ここでジェネレータを実行するための 'co'のようなものを使用するオプションがあれば、試してみることができます。

const co = require('co'); 
 
//allows to wait until EventEmitter such as a steam emits a particular event 
 
const eventToPromise = require('event-to-promise'); 
 
//allows to actually read line by line 
 
const byline = require('byline'); 
 
const Promise = require('bluebird'); 
 

 
class LineReader { 
 
\t constructor (readableStream) { 
 
\t \t let self = this; 
 

 
\t \t //wrap to receive lines on .read() 
 
\t \t this.lineStream = byline(readableStream); 
 

 
\t \t this.lineStream.on('end',() => { 
 
\t \t \t self.isEnded = true; 
 
\t \t }); 
 
\t } 
 

 
\t * getLine() { 
 
\t \t let self = this; 
 

 
\t \t if (self.isEnded) { 
 
\t \t \t return; 
 
\t \t } 
 

 
\t \t //If we recieve null we have to wait until next 'readable' event 
 
\t \t let line = self.lineStream.read(); 
 
\t \t if (line) { 
 
\t \t \t return line; 
 
\t \t } 
 

 
\t \t yield eventToPromise(this.lineStream, 'readable'); 
 

 
\t \t //'readable' fired - proceed reading 
 
\t \t return self.lineStream.read(); 
 
\t } 
 
}

私はテスト目的のためにそれを実行するために、これを使用していました。

co(function *() { 
 
\t let reader = new LineReader(process.stdin); 
 

 
\t for (let i = 0; i < 100; i++) { 
 
\t \t //You might need to call .toString as it's a buffer. 
 
\t \t let line = yield reader.getLine(); 
 
\t \t if (!line) {break;} 
 

 
\t \t console.log(`Received the line from stdin: ${line}`); 
 
\t } 
 
});
は間違いなく、あなたがkoa.js(発電機ベースのExpressのようなフレームワーク)

を使用している場合、あなたはあなたができるES6をしたくない場合は箱から出して動作するようになるだろう裸の約束でも同じことをする。このようなものになるだろう。 http://jsbin.com/qodedosige/1/edit?js

関連する問題