NodeJs之初体验03—回调函数

在跟着菜鸟教程练习回调函数的时候出现了一些状况,就是教程采用的txt文件中是有中文的,但我跟着教程写的代码,读取出来会出现乱码,这是怎么回事呢?


如图,教程的结果是没有问题的

但是我的结果出现了乱码

这就让我很苦恼了,相信大多数0基础的初学者最怕遇到的就是这个问题啦,我跟着教程一步一步做,竟然出现了不一样的结果!!!
有一位伟人曾经说过,遇事不要慌张。而且子曾经曰过,学有不克,善问于度,于是果不其然百度大神给我出了一个点子——请外援!于是我叫来管家npm,让他给我找到了iconv-lite、bufferhelper两个小哥。
先把他们安顿下来


使用install安装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超结果和化验单结果不出来我是不能去找医生对我的病情做进一步的诊断的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352