Node.js控制台有限次读取用户输入 for/while循环无法运行如何解决?
问题根因
readline.question() 属于异步回调方法,while/for循环是同步执行逻辑,直接用循环调用会瞬间创建多个readline实例、绑定大量事件监听器,才会触发MaxListenersExceededWarning事件发射器内存泄漏警告,同时所有输入提示会一次性弹出,交互逻辑完全不符合预期。
解决方案1:异步循环+Promise封装
将单次读取输入的逻辑封装为返回Promise的方法,全程复用同一个readline实例,通过异步等待控制执行顺序:
const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }); function foo(num) { console.log(num) } // 封装单次提问为Promise,完成后自动resolve function readUseInput() { return new Promise(resolve => { readline.question('Enter number...', num => { foo(num); resolve(); }); }) } // 异步循环执行指定次数 async function run(execTimes) { for(let i = 0; i < execTimes; i++) { await readUseInput(); } // 所有输入完成后关闭实例 readline.close(); } // 传入需要执行的次数即可 run(10);
解决方案2:递归实现
如果不使用async/await语法,也可以通过递归控制执行次数:
const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }); function foo(num) { console.log(num) } function readUseInput(execTimes, current = 0) { // 达到执行次数后关闭实例结束流程 if(current >= execTimes) { readline.close(); return; } readline.question('Enter number...', num => { foo(num); // 执行完成后调用下一次 readUseInput(execTimes, current + 1); }); } readUseInput(10);
内容的提问来源于stack exchange,提问作者Alex K
相关产品推荐
相关产品推荐

