使用“process.stdin.once”时进程永远不会结束

goo*_*ion 4 javascript stdin user-input process node.js

在我的节点脚本中,我正在等待用户在某个时候按 Enter 键:

console.log("Press enter to continue...");
await new Promise(function(resolve, reject) {
    process.stdin.once("data", function(data) {
        resolve();
    });
});
Run Code Online (Sandbox Code Playgroud)

该脚本运行良好,只有在用户按下 Enter 后才会继续运行。

但是在执行结束时,进程并没有终止。

相反,它似乎只是等待用户输入(即,每次我按 Enter 时都会打印一个换行符)。

我很确定问题与 相关process.stdin.once,而不是与我如何使用Promise以强制同步执行有关。

我的脚本中有几个地方我必须等待用户按下 Enter,所以process.stdin.end()在解决承诺之前添加在这里是不可能的(这意味着等待用户按下 Enter 只会工作一次)。

我该如何解决这个问题?

Ell*_*son 7

发生这种情况是因为只要您的 stdin 流是open,节点就会假设您可能正在等待更多数据。在您以任何方式读取后,流将自动打开。通知节点您不再需要更多输入的一种简单方法是调用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();
});
Run Code Online (Sandbox Code Playgroud)