在跟着菜鸟教程练习回调函数的时候出现了一些状况,就是教程采用的txt文件中是有中文的,但我跟着教程写的代码,读取出来会出现乱码,这是怎么回事呢?
这就让我很苦恼了,相信大多数0基础的初学者最怕遇到的就是这个问题啦,我跟着教程一步一步做,竟然出现了不一样的结果!!!
有一位伟人曾经说过,遇事不要慌张。而且子曾经曰过,学有不克,善问于度,于是果不其然百度大神给我出了一个点子——请外援!于是我叫来管家npm,让他给我找到了iconv-lite、bufferhelper两个小哥。
先把他们安顿下来
将模块引入后代码如下:
let iconv = require("iconv-lite");
let fs = require("fs");
let data = fs.readFileSync("test/input.txt",{encoding:"binary"});
let buff = new Buffer(data,'binary');
let str = iconv.decode(buff, 'GBK');
console.log(str);
console.log("执行结束")
执行后果然没有乱码了
(node:31344) [DEP0005] DeprecationWarning: Buffer() is deprecated due to securit
y and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or
Buffer.from() methods instead.
懂英语的话就会一眼看出来 原来Buffer()
这个方法已经被废弃掉了,官方并不推荐继续使用这个方法,并且温馨的提示了我们可以用Buffer.alloc()
,Buffer.allocUnsafe()
, 或者 Buffer.from()
这三个方法来替代。
好吧 我们继续深入了解这些新方法都怎么用。。。
我们找到Node.Js中文网,查看buffer的API发现果然已经废弃了,在废弃的api中提醒我们要使用Buffer.from(string[, encoding])
这个方法
修改后代码为:
let iconv = require("iconv-lite");
let fs = require("fs");
let data = fs.readFileSync("test/input.txt",{encoding:"binary"});
// let buff = new Buffer(data,'binary');
let buff = Buffer.from(data,'binary');
let str = iconv.decode(buff, 'GBK');
console.log(str);
console.log("执行结束")
这个事件也让我认识到目前网上找到的一些学习资料大多是比较老版本的了,所以有兴趣深入研究的同学可以去这个网站学习
http://nodejs.cn/api/ 号称唯一与官网同步的nodejs中文文档!
好了话归正传,继续回调函数的学习,上面的例子是一个典型的顺序执行的代码,即程序一行一行按照顺序执行,上一行执行不完,绝对不会执行到下一行,这样执行的话,代码读起来显得井然有序,但是有个缺点就是执行效率很低,如果中间有一步需要很长时间来执行,那后面的所有代码都要等着他执行完毕。这就是阻塞了。
那同理,如果你卡住了,我绕过你,让你先歇歇,我先执行后面的代码,等你歇好了,再追上来把你的结果拿给我,那代码执行起来效率就高了,就是非阻塞了。这就用到回调函数了!
所谓的回调函数,熟悉JS的同学一定不陌生,因为ajax就包括一个异步回调函数,node.js中也是一样,
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调数。
回调函数一般作为函数的最后一个参数出现
下面我们就把上面的例子改装成一个异步非阻塞的demo:
let iconv = require("iconv-lite");
let fs = require("fs");
fs.readFile('test/input.txt',function(err,data){
let buff = Buffer.from(data,'binary');
let str = iconv.decode(buff, 'GBK')
if(err) return console.log(err);
console.log(str);
});
console.log("程序结束")
上面的改写引入了一个回调函数,在加载我们的input.txt文件的时候优先执行后面的程序结束代码,当读取完成后,执行回调函数,打印出来其中的内容。而不是在读取文件的时候傻傻等待,显得不合常理。
所以在当前结果不影响后续代码运行的时候,我们应该使用回调函数来增强程序的执行效率。当然如果后续的代码依赖于前面的结果的时候,还是要等待结果出来才能继续执行的。就好像去医院看病,检查的过程是异步的,我抽完血之后还可以去做B超而不用等待化验结果,但是B超结果和化验单结果不出来我是不能去找医生对我的病情做进一步的诊断的