web-dev-qa-db-ja.com

"process.stdin.on"を使用する方法

Process.stdinを理解しようとしています。

たとえば、配列要素をコンソールに表示する必要があります。また、表示する要素をユーザーが選択できるようにする必要があります。

私はコードを持っています:

var arr = ['elem1','elem2','elem3','elem4','elem5'],
    lastIndx = arr.length-1;

showArrElem();

function showArrElem () {

  console.log('press number from 0 to ' + lastIndx +', or "q" to quit');

  process.stdin.on('readable', function (key) {
        var key = process.stdin.read();
        if (!process.stdin.isRaw) {
          process.stdin.setRawMode( true );
        } else {
          var i = String(key);
          if (i == 'q') {
            process.exit(0);
          } else {
            console.log('you press ' +i); // null
            console.log('e: ' +arr[i]);
            showArrElem();
          };
        };  
  });

};

もう一度数値を入力すると、「i」がnullになるのはなぜですか? 「process.stdin.on」を正しく使用する方法は?

12
ivanesi

入力文字の後に_process.stdin_のreadableリスナーをアタッチしているため、各文字に対してprocess.stdin.read()が複数回呼び出されます。 _process.stdin_がインスタンスであるstream.Readable.read()は、入力バッファーにデータがない場合はnullを返します。これを回避するには、リスナーを1回アタッチします。

_process.stdin.setRawMode(true);
process.stdin.on('readable', function () {
  var key = String(process.stdin.read());
  showArrEl(key);
});

function showArrEl (key) {
  console.log(arr[key]);
}
_

または、process.stdin.once('readable', ...)を使用して1回限りのリスナーをアタッチできます。

9
c.P.u1

これは通常、stdin(node.js)を使用するときに入力を取得する方法です。これはES5バージョンです。ES6はまだ使用していません。

function processThis(input) {
  console.log(input);  //your code goes here
} 

process.stdin.resume();
process.stdin.setEncoding("ascii");
_input = "";
process.stdin.on("data", function (input) {
  _input += input;
});

process.stdin.on("end", function () {
   processThis(_input);
});

お役に立てれば。

1
brian hague