Ответ 1
Работает на меня:
console.log('Press any key to exit');
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on('data', process.exit.bind(process, 0));
Мне нужна функция, которая приостанавливает выполнение скрипта до нажатия клавиши. Я пробовал:
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();
});
но он просто слушает нажатие клавиши, и ничего не происходит. Программа не будет продолжена.
Как приостановить выполнение?
Работает на меня:
console.log('Press any key to exit');
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on('data', process.exit.bind(process, 0));
В node.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 вышел из программы, но любой другой ключ, чтобы продолжить нормальное выполнение, вы можете вместо этого заменить эту функцию нажатием этой функции:
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()
}))
}
Этот фрагмент выполняет эту работу, если вы не хотите выйти из процесса:
console.log('Press any key to continue.');
process.stdin.once('data', function () {
continueDoingStuff();
});
Это async так не будет работать внутри цикла as-is--, если вы используете Node 7, вы можете обернуть его в обещание и использовать async/await
.
Принятое решение ожидает асинхронно для ключевого события, а затем выходит, но это не решение "Нажмите любую клавишу, чтобы продолжить".
Мне нужно было приостановить работу при написании сценариев оболочки nodejs. Я закончил использование spawnSync для дочернего_процесса с командой оболочки "read".
Это будет в основном приостанавливать сценарий, и когда вы нажмете Enter, он будет продолжен. Очень похоже на команду паузы в окнах.
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)
Этот ответ берется из vadzim из node.js: readSync из stdin?
Для этого есть пакет: пресс-любой ключ
И вот пример:
const pressAnyKey = require('press-any-key');
pressAnyKey("Press any key to resolve, or CTRL+C to reject", {
ctrlC: "reject"
})
.then(() => {
console.log('You pressed any key')
})
.catch(() => {
console.log('You pressed CTRL+C')
})
Он работает без проблем в W10.
const fs = require('fs');
process.stdin.setRawMode(true);
fs.readSync(0, Buffer.alloc(1), 0, 1);
60% времени, это работает каждый раз.
Я на самом деле сделал пакет npm под названием paktc
, который поможет вам в этом. Если вы установите пакет:
> npm install paktc
Тогда вы будете использовать его следующим образом:
// your console application code here...
require('paktc') // Press any key to continue...