Node.js 异步编程的直接体现就是回调。

  那什么是回调呢?回调指的是将一个函数作为参数传递给另一个函数,并且通常在第一个函数完成后被调用。需要指明的是,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

  虽然异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

  

  在开始下面的内容之前,我们需要先了解几个概念:

  什么是阻塞:

    所谓阻塞,即每次执行一个操作,在一个操作完成之前,代码的执行会被暂停,无法继续下一个操作。

  什么是非阻塞:

    所谓非阻塞,指的是基于回调、允许脚本并行执行操作的方法,操作结果会在事件发生时由回调来处理,从而无需等待某个操作的结果继续下一步。

  举个栗子解释一下阻塞和非阻塞的区别:

  你在家里做饭,结果发现家里没酱油了,所以你就停下手上的活跑去商店买酱油。结果店员告诉你说现在没酱油了,采购员正在外面采购,需要等一下才回来。这时候你就有两个选择:一是继续在商店里等采购员回来,拿到酱油回家继续做菜;二是先回家忙其他的活,等一下再回来买酱油。

  第一个选择其实就是阻塞的做法,需要等到酱油买到之后才继续其他的事。第二个选择就是非阻塞的做法,先去做其他的事,等到合适的时候再去买酱油。(当然,这栗子有点不靠谱。希望大家能看懂我的意思。)

  实践出真知,讲完基础的知识点,那就开始敲一下代码吧。撸起袖子就是干。

  现在这里过一下下面实例会使用到的API:

  

  读取文件(同步操作):fs.readFileSync(file[, options])

  

  读取文件(异步操作):fs.readFile(file[, options], callback)

  阻塞代码实例

  先新建一个txt文件,比如demo2.txt。然后在里面随便敲一点东西,比如:

******   this is my second demo!   ******

  然后再在同个目录下新建一个js脚本,我把它取名为demo2.js,代码如下:

//引入fs(filesystem)模块,在脚本使用
var fs = require("fs");
//同步读取文件
var data = fs.readFileSync('demo2.txt');
//打印数据
console.log(data.toString());
console.log("------ 程序执行结束! ------");

  最后就可以使用node指令运行我们的代码了!是不是很心急,那就来看看吧。

//node指令
node demo2.js

  cmd运行效果:

  可以看到,js脚本读取完文件并输出文件内容之后,才会继续执行下面的console.log("------ 程序执行结束! ------")。由于读取文件和输出内容需要时间,在读取和输出的过程中脚本并不会先去执行其他代码,而是要等到读取并输出文件内容完成之后才会接着去进行下一步操作。这就是所谓的(同步)阻塞。

  非阻塞代码实例

  demo2.txt仍跟之前的一样。我们只要修改demo.js代码就行,具体代码如下:

//引入fs(filesystem)模块,在脚本使用
var fs = require("fs");
//异步读取文件
fs.readFile('demo2.txt', function (err, data) {
if (err) return console.error(err); //若读取失败,则报出错误
console.log(data.toString()); //读取成功则输出文件内容
});
console.log("程序执行结束!");

  来看看运行效果:

  可以看到,由于使用了异步读取操作,所以在读取文件的时候,脚本会继续执行下面的代码,也就是说,不管文件是否读取并输出完毕,脚本都会往下执行。所以就会看到先执行完console.log("------ 程序执行结束! ------")之后才看到输出"******   this is my second demo!   ******"。这就是所谓的(异步)非阻塞。

  

  以上两个实例我们了解了阻塞与非阻塞调用的不同。第一个实例在文件读取完后才执行完程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。

因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

  

  你们看懂了吗?反正我是懂了(~ ̄▽ ̄)~

node.js学习笔记(二)——回调函数的更多相关文章

  1. Node.js自学笔记之回调函数

    写在前面:如果你是一个前端程序员,你不懂得像PHP.Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择.这段时间对node.js进行了简单的学习,在这里 ...

  2. [转]node.js学习笔记(二)

    二.express 1.安装 express4 npm --registry=http://registry.npmjs.org install -g express-generator (全局) 2 ...

  3. Node.js学习笔记(二) --- CommonJs和Nodejs 中自定义模块

    一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一 ...

  4. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  5. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  6. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  7. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  8. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  9. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

随机推荐

  1. fiddler post 请求 webapi

    今天小伙伴遇到一个问题,大概就是说用fiddler post 一个参数,但是后台一直无法获取,如下 后来发现请求的条件有问题,而且也很容易忽略,正确如下 content-type的设定为默认值,pos ...

  2. C++用法总结

    1.C++的绝对值符号 如果是整形的,就是abs() 如果是浮点型的,是fabs() 这两个函数都从属于库函数math.h #include <cmath> or #include< ...

  3. LA 3938 动态最大连续区间 线段树

    思路很清晰,实现很繁琐.分析过程可以参考LRJ,自己的总结晚些放. #include <cstdio> #include <cstring> #include <algo ...

  4. [AHOI2005]矿藏编码

    嘟嘟嘟 这道题题面我是看了小半天才懂(太菜了),然后就发现好水啊. 只要维护一个栈,存的是t,代表当前的正方形是2t * 2t的,然后从头开始扫序列,如果遇到2,就把栈顶元素取出来,然后放进去四个t ...

  5. Django提示Unknown database处理方法

    cmd.exe运行别人的程序 C:\Python27\Python.exe E:\Django\Guest\Guest\manage.py runserver 提示 django.db.utils.I ...

  6. Opencv——级联分类器(AdaBoost)

    API说明: cv::CascadeClassifier::detectMultiScale(InputArray image,//输入灰度图像 CV_OUT std::vector<Rect& ...

  7. Kafka设计解析(九)为何去掉replica.lag.max.messages参数

    转载自 huxihx,原文链接 Kafka副本管理—— 为何去掉replica.lag.max.messages参数 在Kafka设计解析(二)Kafka High Availability (上)文 ...

  8. 404 Note Found 队-Beta1

    目录 组员情况 组员1(组长):胡绪佩 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最新成果 团 ...

  9. 在线扫描PDF JPG 图片上面文字

    在线扫描PDF JPG 图片上面文字

  10. OC 知识:Foundation 框架及相关类详尽总结

    本文用来介绍Foundation框架的相关知识,以及Foundation框架所提供类的相关知识总结. 1. 框架介绍 框架是由很多类.方法.函数和文档按照一定的逻辑组织起来的集合,以使开发程序变得更加 ...