Процесс никогда не заканчивается при использовании 'process.stdin.once' - PullRequest
0 голосов
/ 14 января 2019

В моем скрипте узла я жду, когда пользователь в какой-то момент нажмет ввод:

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() перед разрешением обещания здесь не может быть и речи (это означает, что ожидание нажатия пользователем ввода будет работать только один раз).

Кто-нибудь знает, как я могу решить эту проблему?

Спасибо!

1 Ответ

0 голосов
/ 14 января 2019

Это происходит потому, что пока ваш поток 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();
});
...