为什么 readlineInterface.question() 提前运行?

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

我一直在开发一款名为“秘密消息”的游戏,其中玩家必须猜测隐藏在目录中的多个文本文件中的秘密消息。我的应用程序是一个节点模块,以便我可以使用 Chalk5 ESM。我正在使用 readline 回调 API 来评估用户输入。

我分别使用

process.stdin
process.stdout
作为我的
input
output
初始化了一个 readline 接口。我的问题是,每当我使用
question()
方法时,我的代码似乎无需我的输入即可运行。每当我使用 Node REPL 时都会发生同样的情况;使用 readline.createInterface 创建新界面后,我在终端中输入的任何内容都会加倍。例如:

> const rl = require('readline')
// output: undefined
> const channel = rl.createInterface({input: process.stdin, output: process.stdout})
// output: undefined

然后,尝试输入

channel.question( ... )
会导致:

// This is my real input.
> cchaannnneell..qquueessttiioonn(())

有谁知道这是怎么回事吗?

以下是实际游戏的相关代码部分:

function getDirParameter(dirParameter, directoryQuery) {
  let userChoice;
  channel.question(directoryQuery, (dirChoice) => {
    userChoice = dirChoice;
    console.log(dirChoice);
    switch(dirChoice) {
      case 'current':
        dirParameter = __dirname;
        break;
      case 'custom':
        console.log('User chose "custom".');
        break; 
      default: 
        console.error('Invalid option.');
        break;
    }
    channel.close();
  });
  
  return userChoice;
}

我尝试在关闭界面之前记录用户输入。终端最终没有记录任何内容。

node.js terminal callback readline
1个回答
0
投票

您显示的代码看起来不完整,因为您实际上没有根据

switch()
语句执行任何不同的操作。但是,这是该函数的承诺版本:

async function getDirParameter(channel, dirParameter, directoryQuery) {
    return new Promise((resolve, reject) => {
        channel.question(directoryQuery, (dirChoice) => {
            console.log(dirChoice);
            switch (dirChoice) {
                case 'current':
                    dirParameter = __dirname;
                    break;
                case 'custom':
                    console.log('User chose "custom".');
                    break;
                default:
                    console.error('Invalid option.');
                    break;
            }
            resolve(dirChoice);
        });
    });
}

您可以在

async
函数中使用它,如下所示:

const dirChoice = await getDirParameter(channel, dirQuery);

请注意,此版本的函数不会关闭通道,因为打开通道的代码似乎应该是关闭通道的代码,并且此函数可能希望在同一通道上多次使用。这是一个需要你决定的设计选择,但这对我来说很有意义,所以我就这样重写了。

附注分配给像

dirParameter
这样的函数参数,然后不对 dirParameter 执行任何其他操作,实际上并不会完成任何事情,所以基本上,您
swtich()
语句没有完成任何事情。也许还有更多代码......

© www.soinside.com 2019 - 2024. All rights reserved.