按键侦听器上的 Node.js 进程/读取线可防止应用程序自行结束

问题描述 投票:0回答:1

我正在努力:

  • 为 TUI Node.js 应用程序编写一个简单的可等待异步函数
  • 等待键盘上的单个按键按下(之后无需按 Enter)
  • 并返回有关按下的键的信息
  • ...不使用任何 NPM 包

这是我的功能:

export async function inkey_promise() {
    console.log('Press any key...');

    return new Promise((resolve) => {
        readline.emitKeypressEvents(process.stdin);
        process.stdin.setRawMode(true);
        const listener = (str, readline_key) => {
            process.stdin.setRawMode(false);
            process.stdin.resume();
            console.log(`RETURNING: `, readline_key);
            return resolve(readline_key);
        };
        process.stdin.once('keypress', listener);
    });
}

我这样称呼它:

const key_info = await inkey_promise();

问题:

按键后:

  • 正如预期的那样:
    • 承诺兑现
    • 等待后我的代码继续进行
  • 但是:
    • 当没有什么可做的时候,我的node.js应用程序将永远运行,除非我手动终止进程,否则它永远不会退出
    • 我不想在这里显式地执行
      process.exit()
      ,因为按下按键后它总是会做一些事情......但是当它没有什么可做的时候,它仍然应该像以前一样正常退出。

所以看来我还需要做一些其他事情才能将进程/标准输入/键盘完全返回到其默认行为/状态?

javascript node.js keyboard keypress readline
1个回答
0
投票
  • 设法解决它。
  • 这是我最终得到的代码(作为 TypeScript):
import readline from 'readline';

type Args_tui_prompt_inkey = {
    echo_debug: boolean;
};

export async function tui_prompt_inkey(args?: Args_tui_prompt_inkey): Promise<Output_tui_prompt_inkey> {
    return new Promise((resolve) => {
        const rl = readline.createInterface({
            input: process.stdin,
            output: process.stdout,
        });
        const listener = (_arg1: never, rkey: readline.Key) => {
            rl.close();
            if (args?.echo_debug) console.log(`rkey is: `, rkey);
            resolve({
                rkey: rkey,
            });
        };
        // using ['input'] to suppress TS errors
        rl['input'].once('keypress', listener);
        rl['input'].setRawMode(true);
        rl['input'].resume();
    });
}

type Output_tui_prompt_inkey = {
    rkey: readline.Key;
};

  • TypeScript 不喜欢我尝试访问
    rl.input
    • 因此使用
      rl['input']
      来代替。
    • 如果有人知道有更好的类型安全性的更简单/更干净的替代方案,请告诉我。
© www.soinside.com 2019 - 2024. All rights reserved.