使用 'process.stdin.once' 时进程永远不会结束
Process never ends when using 'process.stdin.once'
在我的节点脚本中,我正在等待用户在某个时候按下回车键:
console.log("Press enter to continue...");
await new Promise(function(resolve, reject) {
process.stdin.once("data", function(data) {
resolve();
});
});
脚本运行良好,只有在用户按下回车键后才会继续。
但是执行到最后,进程并没有终止。
相反,它似乎只是等待用户输入(即,每次我按回车键时都会打印一个换行符)。
我很确定问题与 process.stdin.once
有关,与我如何使用 Promise
强制同步执行无关。
我的脚本中有几个地方必须等待用户按下回车键,所以在解决承诺之前添加 process.stdin.end()
在这里是不可能的(这意味着等待用户按 enter 只会工作一次)。
我该如何解决这个问题?
发生这种情况是因为只要您的标准输入流 open,node 就会假设您可能正在等待更多数据。在您以任何方式读取流后,该流会自动打开。通知节点您不再需要更多输入的一种简单方法是调用 pause()
。这是一个简单的例子:
async function example() {
console.log("Step 1");
await new Promise(function(resolve, reject) {
process.stdin.once("data", function(data) {
resolve();
});
});
console.log("Step 2");
await new Promise(function(resolve, reject) {
process.stdin.once("data", function(data) {
resolve();
});
});
// more steps...
}
example().then(() => {
console.log("Done");
process.stdin.pause();
});
在我的节点脚本中,我正在等待用户在某个时候按下回车键:
console.log("Press enter to continue...");
await new Promise(function(resolve, reject) {
process.stdin.once("data", function(data) {
resolve();
});
});
脚本运行良好,只有在用户按下回车键后才会继续。
但是执行到最后,进程并没有终止。
相反,它似乎只是等待用户输入(即,每次我按回车键时都会打印一个换行符)。
我很确定问题与 process.stdin.once
有关,与我如何使用 Promise
强制同步执行无关。
我的脚本中有几个地方必须等待用户按下回车键,所以在解决承诺之前添加 process.stdin.end()
在这里是不可能的(这意味着等待用户按 enter 只会工作一次)。
我该如何解决这个问题?
发生这种情况是因为只要您的标准输入流 open,node 就会假设您可能正在等待更多数据。在您以任何方式读取流后,该流会自动打开。通知节点您不再需要更多输入的一种简单方法是调用 pause()
。这是一个简单的例子:
async function example() {
console.log("Step 1");
await new Promise(function(resolve, reject) {
process.stdin.once("data", function(data) {
resolve();
});
});
console.log("Step 2");
await new Promise(function(resolve, reject) {
process.stdin.once("data", function(data) {
resolve();
});
});
// more steps...
}
example().then(() => {
console.log("Done");
process.stdin.pause();
});