javascript - Node.js - 如何将 readline 答案存储在变量中

标签 javascript node.js readline

我正在node.js 中构建Yahtzee。我使用下面的代码来要求用户输入。答案需要存储在变量中。我假设 [answer] 用于临时存储答案值,但是如何在不对代码结构进行太多更改的情况下将 [answer] 取出到数组中?

基本代码结构:

const readline = require('readline');

const rl = readline.createInterface({
  input:  process.stdin,
  output: process.stdout
});

rl.question("Which dices to keep [1,2,3,4,5] ?: ", (answer) => {
  console.log("Will keep dices: ", answer);
  rl.close();
});

扩展基本代码结构,将用户输入的答案添加到变量中:

var lines;                                 // Added compared to basic code.
const readline = require('readline');
const rl = readline.createInterface({
  input:  process.stdin,
  output: process.stdout
});
rl.question("Which dices to keep [1,2,3,4,5] ?: ", (answer) => {
  lines.push(answer);                      // Added compared to basic code.
  console.log("Will keep dices: ", answer);
  rl.close();
});
console.log(lines);                        // Added compared to basic code.

终端结果:未定义。

最佳答案

这并不是真正的工作原理 - 对于用户输入等异步操作,预计您将在回调中处理结果,而不是“等待”完成。您可以做的一件事是将代码包装在 Promise 中,如下所示:

const readline = require('readline');

function getDiceAnswer() {
    return new Promise(resolve => {    
        const rl = readline.createInterface({
            input:  process.stdin,
            output: process.stdout
        });
        rl.question("Which dices to keep [1,2,3,4,5] ?: ", (answer) => {
            resolve(answer);
            console.log("Will keep dices: ", answer);
            rl.close();
        });
    });   
}

这仍然意味着您需要在回调中处理结果:

const lines = [];
getDiceAnswer().then(answer => {
     lines.push(answer);
     console.log(lines);
});

...但是您可以使用 Javascript async/await 表示法使其看起来更好:

async function getAnswers() {
     const diceAnswer = await getDiceAnswer();

     //this line won't execute until the answer is ready
     lines.push(diceAnswer);
}

另一种简单的替代方法是使用像readline-sync这样的包来使操作成为同步操作:https://www.npmjs.com/package/readline-sync

关于javascript - Node.js - 如何将 readline 答案存储在变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54468349/

相关文章:

javascript - 如何不使用 toLocaleString 显示秒数

node.js - AWS SQS 从 lambda 触发到 Amazon Lightsails

node.js - 如何在 webpack 中包含 readline

c# - [c#]如何让控制台在一行中读取两个字符串

后面跟着 readline() 时绘图命令失败

使用文件的一部分生成 JavaScript 文件哈希值

javascript - 返回( dispatch )未解雇

JavaScript 正则表达式检查单个特殊字符在字符串中是否出现一次

javascript - 在 nodeJs 中向客户端发送错误时出错

node.js - 如何使用 Gatsby 生成的页面作为主页?