我一直在开发一款名为“秘密消息”的游戏,其中玩家必须猜测隐藏在目录中的多个文本文件中的秘密消息。我的应用程序是一个节点模块,以便我可以使用 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;
}
我尝试在关闭界面之前记录用户输入。终端最终没有记录任何内容。
您显示的代码看起来不完整,因为您实际上没有根据
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()
语句没有完成任何事情。也许还有更多代码......