javascript - 如何读取用户输入的 Node.js - 使用 Promises 重构

标签 javascript node.js command-line promise

请阅读this very short article以加快我正在尝试做的事情。

要点是,正如作者所说,我“需要问用户几个问题,...验证输入数据并在输入错误时重新提问。”此外,除了根据正则表达式检查输入之外,我可能还需要做更复杂的事情来验证输入。例如,检查以确保当前输入不是由用户在较早的提示中输入的。

我有兴趣重构本文中的主要代码片段,使其基于 promise 。我想这样做的明显原因是为了避免在我需要提示用户超过两三次的情况下出现回调 hell 。你对如何重构它有什么建议吗?让我感到困惑的是对 ask() 的递归调用,以及如果 promise 失败,就是这样:它完成了。而此代码需要一遍又一遍地循环,直到获得有效输入。所以我什至不知道从哪里开始。

此外,如果您有任何“快线结”式的解决方案,我愿意朝着完全不同的方向前进。也许 Node 有一个内置库来做这种我不知道的事情?也许 readline?我不知道,因为我对这些东西太陌生了,而且 readline API 对我来说并没有多大意义......

基本上,如果你能想出任何方法来重构它,这样我就不必深入回调回调的噩梦,我将不胜感激:)

无论如何,这里是完整的代码片段:

function ask(question, format, callback) {
 var stdin = process.stdin, stdout = process.stdout;

 stdin.resume();
 stdout.write(question + ": ");

 stdin.once('data', function(data) {
   data = data.toString().trim();

   if (format.test(data)) {
     callback(data);
   } else {
     stdout.write("It should match: "+ format +"\n");
     ask(question, format, callback);
   }
 });
}

最佳答案

首先,promisify 标准输入读取器:

function askOnce(question){
  var stdin = process.stdin, stdout = process.stdout;

  stdin.resume();
  stdout.write(question + ": ");

  return new Promise(res => {
    stdin.once('data', function(data) {
      res(data.toString().trim());
    });
  });
}

所以不问是容易的:

async function ask(question, format){
  let answer;

  do {
    answer = await askOnce(question);
  } while(!answer.test(format));

  return answer;
}

没有 async/await 它有点丑陋(使用递归和 promise 展平机制):

 function ask(question, format){
   return askOnce(question).then(answer =>  {
      if(!answer.test(format))
         return ask(question, format);
      return answer;
  });
}

关于javascript - 如何读取用户输入的 Node.js - 使用 Promises 重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48342700/

相关文章:

amazon-web-services - 使用 aws-cli 从命令行创建 Route53 记录

linux - 在linux系统中查找所有匹配 'name'的文件,并从中搜索 'text'

command-line - Windows 命令提示符中的 F-N 快捷键

javascript - 这三种形式的自调用匿名函数有什么区别?

javascript - Google GeoCharts 颜色不起作用

javascript - 如何可靠地散列 JavaScript 对象?

node.js - 使用 sequelize 制作具有 hasMany 关系 postgresql 的 API

javascript - 如何要求 jQuery 停止对 AJAX 响应的脚本评估?

node.js - 更改 Phonegap 上 Nodejs 的目标 sdk

javascript - 从字符串渲染 React 组件