为了账号安全,请及时绑定邮箱和手机立即绑定

脚本中和在解释器中使用 fs.readFile() 得到不同的结果

脚本中和在解释器中使用 fs.readFile() 得到不同的结果

慕田峪9158850 2019-04-08 11:19:24
因为完全没理解回调函数的概念,所以我写了以下的代码(function(){varfs=require('fs');varcallback=(function(){str='';returnfunction(err,contents){if(contents!==undefined){str+=contents;}returnstr;};})();fs.readFile(process.argv[2],'utf8',callback);varlines=callback().split('\n').length-1;console.log(lines);})();不知为何,在解释器里直接运行则没问题,可是保存为脚本运行时,lines就只能为0了,这是为什么呢?谢谢!
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

试下:
(function(){
varfs=require('fs');
varcallback=function(err,contents){
varstr='';
if(contents!==undefined){
str+=contents;
}
varlines=str.split('\n').length-1;
console.log(lines);
};
fs.readFile(process.argv[1],'utf8',callback);
})();
因为当保存为文件的时候,这里就用到了fs.readFile,而nodejs是异步非阻塞的.
它会先执行后面的代码,当文件读取完之后再执行callback中的方法,所以fs.readFile还没有执行完,就执行了后面来计算行数,当然为0了。
你可以在callback中console.log('hello'),看看执行顺序就知道了!
tips:你用callback()想要来获取str也不对吧,连参数都没有哦~
因此由于nodejs的异步非阻塞,当你需要获取fs.readFile等类似的函数执行的结果的时候,就需要将处理结果的代码卸载callback中,否则代码的执行结果往往会令人匪夷所思。
当有大量的这样的需求的时候就会出现callback的循环嵌套了,最后的代码就会很难维护,所以就需要借助一个模块来进行流程控制了,我用的是async。
注:当然nodejs也提供了readFileSync类似的同步函数,但是非常不建议这么做,否则nodejs的优势就没了!
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 400 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信