2016-09-08 4 views
9

node.jsを使用しています。v4.5keypressを使用してnode.jsでアクションを開始する

以下の機能を使用して、繰り返しのメッセージを遅延で送信しました。

function send_messages() { 
    Promise.resolve() 
     .then(() => send_msg()) 
     .then(() => Delay(1000)) 
     .then(() => send_msg()) 
     .then(() => Delay(1000)) 
     .then(() => send_msg())   
    ; 
} 

function Delay(duration) { 
    return new Promise((resolve) => { 
     setTimeout(() => resolve(), duration); 
    }); 
} 

遅延の代わりに、キー押しを使用してメッセージの送信を有効にしたいと思います。以下のような機能があります。

function send_messages_keystroke() { 
    Promise.resolve() 
     .then(() => send_msg()) 
     .then(() => keyPress('ctrl-b')) //Run subsequent line of code send_msg() if keystroke ctrl-b is pressed 
     .then(() => send_msg()) 
     .then(() => keyPress('ctrl-b')) 
     .then(() => send_msg())   
    ; 
} 

答えて

6

process.stdinをrawモードで入力すると、個々のキーストロークにアクセスできます。ここで

は、スタンドアロンの例です:

function send_msg(msg) { 
    console.log('Message:', msg); 
} 

// To map the `value` parameter to the required keystroke, see: 
// http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ctrl.htm 
function keyPress(value) { 
    return new Promise((resolve, reject) => { 
    process.stdin.setRawMode(true); 
    process.stdin.once('data', keystroke => { 
     process.stdin.setRawMode(false); 
     if (keystroke[0] === value) return resolve(); 
     return reject(Error('invalid keystroke')); 
    }); 
    }) 
} 

Promise.resolve() 
    .then(() => send_msg('1')) 
    .then(() => keyPress(2)) 
    .then(() => send_msg('2')) 
    .then(() => keyPress(2)) 
    .then(() => send_msg('done')) 
    .catch(e => console.error('Error', e)) 

それははCtrl-Bはありませんが、その振る舞いをしたい(とだけしたくない場合は、コードが簡単に変更可能である任意のキーストロークを拒否しますたとえば、最初にCtrl-Bを待ちます。

keyPress

に渡される値は、キーの進ASCII値である:はCtrl-は、はCtrl-Bが2で、1 等、

EDIT 97です。 @ mh-cbonのコメントのように、より良い解決法はkeypressモジュールを使うことです。

+0

お返事ありがとうございます。 Upvoted。 1がCtrl-A、2 - > Ctrl-B、 - > 97の値をどうやって得るのですか? –

+1

@ user91579631 [このウェブページ](http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ctrl.htm)を参照してください。 _ "Dec" _ codeは、あなたが 'keyPress'に渡す番号です。通常の文字については、[このページ](http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_std.htm)を参照してください。 – robertklep

+1

tootallnate keypressモジュールを使用する必要がありますhttps://github.com/TooTallNate/keypress –

1

これを試してみてください。上で述べたように、keypressを使うと本当に簡単です。コード内のkeyオブジェクトは、ctrlまたはshiftが押されたかどうか、および押された文字を示します。残念ながら、keypressは数字や特殊文字を処理していないようです。

var keypress = require('keypress'); 

keypress(process.stdin); 

process.stdin.on('keypress', function (ch, key) { 
    console.log("here's the key object", key); 

    shouldExit(key); 
    if (key) { 
    sendMessage(key); 
    } 
}); 

function shouldExit(key) { 
    if (key && key.ctrl && key.name == 'c') { 
    process.stdin.pause(); 
    } 
} 

function sendMessage(key) { 
    switch(key.name) { 
    case 'a'; 
     console.log('you typed a'); break; 
    case 'b'; 
     console.log('you typed b'); break; 
    default: 
     console.log('bob is cool'); 
    } 
} 

そしてもちろん、ここsendMessage()機能で、あなたは簡単に、他のより複雑なものとログ文を置き換えるいくつかの非同期呼び出しを行う、他のいくつかの関数を呼び出し、どんなことができます。 process.stdin.pause()は、プログラムがctrl-cで終了するようにします。そうしないと、プログラムは実行を継続し、割り込み信号をブロックします。コマンドラインで手動でプロセスを終了する必要があります。

関連する問題