Node.js readline模块读取txt文件时close事件过早触发问题排查
问题原因与解决办法
你的问题出在**line事件回调里调用了rl.close()**——每次读取到一行内容后,你立刻关闭了readline实例,导致程序只处理第一行就触发了close事件,完全没机会读取后续行。
修正方法很简单,把rl.close()从line事件的回调里删掉即可:
rl.on('line', function (line) { var longest=true; nLines++; var words=line.split(" "); nWords += words.length; wordsPerLine[nLines] = words.length; for(len in wordsPerLine) if(len > words.length) longest=false; if(longest) longestLine=nLines; console.log("Line: ",nLines," - ",words.length," words, "," is the longest: ",longest); // 移除这行手动关闭代码:rl.close(); }).on('close',function (line) { console.log("Counted: "+nWords+" words, longest line is number "+longestLine); res.write(getResponse(file, nLines,nWords, wordsPerLine,longestLine)); res.end(); });
当readline读完文件所有内容后,会自动触发close事件,这时再执行统计结果输出和响应返回就正常了。
另外提个小优化:你用for(len in wordsPerLine)遍历数组的方式不太合适,in遍历的是键名,容易出现逻辑偏差。可以改成普通for循环来遍历行数字段,还能提前终止判断提升效率:
for (let i = 1; i <= nLines; i++) { if (wordsPerLine[i] > words.length) { longest = false; break; // 找到更长的行就停止判断 } }
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

