нажмите любую клавишу, чтобы продолжить в nodejs
Мне нужна функция, которая приостанавливает выполнение скрипта до нажатия клавиши. Я пробовал:
var stdin = process.openStdin();
require('tty').setRawMode(true);
stdin.on('keypress', function (chunk, key) {
process.stdout.write('Get Chunk: ' + chunk + 'n');
if (key && key.ctrl && key.name == 'c') process.exit();
});
но это просто прослушивание для нажатия и ничего не происходит. Программа не продолжает выполнение.
Как приостановить выполнение?
6 ответов
У меня работает:
console.log('Press any key to exit');
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on('data', process.exit.bind(process, 0));
этот фрагмент выполняет работу, если вы не хотите выходить из процесса:
console.log('Press any key to continue.');
process.stdin.once('data', function () {
continueDoingStuff();
});
это асинхронно, поэтому не будет работать внутри цикла как есть-если вы используете узел 7, Вы можете обернуть его в обещание и использовать async/await
.
в узел.js 7.6 и позже вы можете сделать это:
const keypress = async () => {
process.stdin.setRawMode(true)
return new Promise(resolve => process.stdin.once('data', () => {
process.stdin.setRawMode(false)
resolve()
}))
}
;(async () => {
console.log('program started, press any key to continue')
await keypress()
console.log('program still running, press any key to continue')
await keypress()
console.log('bye')
})().then(process.exit)
или если вы хотите CTRL-C для выхода из программы, но любой другой ключ для продолжения нормального выполнения, то вы можете заменить функцию "keypress" выше этой функцией:
const keypress = async () => {
process.stdin.setRawMode(true)
return new Promise(resolve => process.stdin.once('data', data => {
const byteArray = [...data]
if (byteArray.length > 0 && byteArray[0] === 3) {
console.log('^C')
process.exit(1)
}
process.stdin.setRawMode(false)
resolve()
}))
}
принятое решение асинхронно ожидает ключевого события, а затем завершает работу, на самом деле это не решение "нажать любую клавишу для продолжения".
Мне нужно было сделать паузу при написании некоторых сценариев оболочки nodejs. Я закончил использование spawnSync child_process с командой оболочки "read".
это в основном приостановит скрипт, и когда вы нажмете Enter, он продолжит работу. Очень похоже на команду паузы в windows.
require('child_process').spawnSync("read _ ", {shell: true, stdio: [0, 1, 2]});
надеюсь, что это помогает.
var fs = require("fs")
var fd = fs.openSync("/dev/stdin", "rs")
fs.readSync(fd, new Buffer(1), 0, 1)
fs.closeSync(fd)
этот ответ взят у Вадима из узел.js: readSync из stdin?
я фактически сделал пакет npm под названием paktc
что поможет вам в этом. Если вы устанавливаете пакет:
> npm install paktc
тогда вы бы использовали его следующим образом:
// your console application code here...
require('paktc') // Press any key to continue...