使用'process.stdin.once'时,进程永无止境

时间:2019-01-14 13:45:28

标签: javascript node.js process user-input stdin

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

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

该脚本运行良好,并且仅在用户按下Enter键后才能继续。

但是在执行结束时,该过程不会终止。

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

我非常确定问题与process.stdin.once有关,而不与我如何使用Promise来强制同步执行有关。

我在脚本中有几个地方必须等待用户按下Enter键,因此此处无法解决承诺之前添加process.stdin.end()(这意味着等待用户按下Enter键将只工作一次)。

有没有人知道如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:4)

之所以发生这种情况,是因为只要您的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();
});