javascript - mac - Presiona cualquier tecla para continuar en nodejs.
instalar node js en windows 10 (7)
Necesito una función que detenga la ejecución de la secuencia de comandos hasta que se presione una tecla. He intentado:
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();
});
Pero es solo escuchar una pulsación de tecla y no pasa nada. El programa no sigue ejecutándose.
¿Cómo puedo pausar la ejecución?
De hecho, hice un paquete npm llamado paktc
que te ayudará con esto. Si instala el paquete:
> npm install paktc
Entonces lo usarías así:
// your console application code here...
require(''paktc'') // Press any key to continue...
En node.js 7.6 y posteriores puedes hacer esto:
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)
O si desea que CTRL-C salga del programa pero que cualquier otra tecla continúe con la ejecución normal, puede reemplazar la función de "pulsación de teclas" anterior con esta función:
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()
}))
}
Este fragmento hace el trabajo si no desea salir del proceso:
console.log(''Press any key to continue.'');
process.stdin.once(''data'', function () {
continueDoingStuff();
});
Es asíncrono, por lo que no funcionará dentro del bucle como está: si está usando el Nodo 7, podría envolverlo en una promesa y usar async/await
.
Funciona para mi:
console.log(''Press any key to exit'');
process.stdin.setRawMode(true);
process.stdin.resume();
process.stdin.on(''data'', process.exit.bind(process, 0));
Hay un paquete para esto: press-any-key
Y aquí hay un ejemplo:
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'')
})
Se ejecuta sin problemas en W10.
La solución aceptada espera de forma asíncrona un evento clave y luego sale, no es realmente una solución para "Presionar cualquier tecla para continuar".
Necesitaba pausar mientras escribía algunos scripts de shell de nodejs. Terminé usando el spawnSync del child_process con el comando de shell "leer".
Básicamente, esto detendrá la secuencia de comandos y cuando presione Entrar, continuará. Al igual que el comando de pausa en Windows.
require(''child_process'').spawnSync("read _ ", {shell: true, stdio: [0, 1, 2]});
Espero que esto ayude.
var fs = require("fs")
var fd = fs.openSync("/dev/stdin", "rs")
fs.readSync(fd, new Buffer(1), 0, 1)
fs.closeSync(fd)
Esta respuesta se toma de vadzim de node.js: readSync from stdin?