【问题标题】:read user input N times from console node js从控制台节点js读取用户输入N次
【发布时间】:2021-10-26 00:19:06
【问题描述】:

我正在尝试将用户输入到节点 js 中的控制台有限次数,并在每个输入上运行一个函数。 while 或 for 循环不起作用。

有什么帮助吗?

这是我的代码(有点简化):

function foo(num)
{
 console.log(num)
}

function ReadUseInput()
{
 const readline = require('readline').createInterface({
     input: process.stdin,
    output: process.stdout
   }); 
    readline.question('Enter number...', num => 
  {
         foo(num)
       readline.close();
     });
}

//for (var i = 0; i < 10; i++)// this line isnt working - shows warning: MaxListenersExceededWarning: Possible EventEmitter memory leak detected
ReadUseInput()

【问题讨论】:

  • Event Emitter 的默认限制是 10。所以你通过循环十次来达到限制
  • 它不是一个限制,您可以超越这个限制。它警告你做一些可疑的事情

标签: javascript node.js loops readline


【解决方案1】:

一种解决方案可能是让ReadUseInput() 函数接受一个数字并递减它以重复一定次数:

function foo(num) {
 console.log(num)
}

function ReadUseInput(timesLeft) {
  // exit condition
  if(timesLeft <= 0) {
    return;
  }
  const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
  }); 
  readline.question('Enter number...', num => {
    foo(num)
    readline.close();
    ReadUseInput(--timesLeft);
  });
}

ReadUseInput(10);

【讨论】:

  • 您提供的解决方案@theusaf 似乎合乎逻辑.. 它不再发出警告,但它似乎仍然从我的测试中运行无限次(至少超过 10 次)。退出条件似乎不起作用
  • 哦,我的错。我犯了一个小错误。我会尽快解决的
  • 已经解决了,谢谢!我有点想知道你改变了什么阻止它无限循环,因为老实说我看不出有什么区别@theusaf
  • 以前,我做过timesLeft--,它在递减之前传入当前值,这就是它永远持续下去的原因。我改成--timesLeft递减,然后传入值。
  • 在这个话题上,为什么递归在这种情况下有效,而 for 循环却不行?我错过了什么?我应该参考什么主题? (我应该将此作为问题发布吗?)
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多