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. JqGrid中文文档之TreeGrid

    几年之前写过一个非常简单的jqgrid属性说明. 今天又用到jqgrid这个控件了,捣鼓了许久,第一个treegrid完成了 jQuery("#list1").jqGrid({ u ...

  2. list(range())--------range创建一个list列表 遍历索引range(len()) 和 list(range())创建列表

    lst = list(range(15,26)) #注,list(range())用的是小括号哦print(lst)

  3. IDEA 使用技巧 Update

    IDEA使用起来和Eclipse很大区别. 1.快捷键. 因为一个个熟悉起来费时间,就直接在Preferences—keymap里选择了Eclipse OS X,这样快捷键就转换到了Mac下Eclip ...

  4. Mysql数据库的mysql Schema 究竟有哪些东西& 手工注入的基础要领

    #查看数据库版本号 mysql> select @@version; +------------+ | @@version  | +------------+ | 5.5.16-log | +- ...

  5. [CEOI2017]Building Bridges

    题目 斜率优化思博题,不想写了 之后就一直\(95\)了,于是靠肮脏的打表 就是更新了一下凸壳上二分斜率的写法,非常清爽好写 就当是挂个板子了 #include<algorithm> #i ...

  6. Zookeeper学习之路 (二)集群搭建

    ZooKeeper 软件安装须知 鉴于 ZooKeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop1,hadoop2,hadoop3 ZooKeep ...

  7. etherlime-2-Etherlime Library API-deployer

    Etherlime Library API 库API Deployer部署者 Deployer functionality The main functionality the deployer ex ...

  8. Zookeeper入门(四)之Leader选举

    让我们分析如何在ZooKeeper集合中选举leader节点.考虑一个集群中有N个节点.leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的 ...

  9. Mac app打包成dmg

    1. 找到打包的app文件,在Xcode工程的Products目录下 2. 在桌面新建一个文件夹dmg,将app文件放进去. 3. 为了实现拖拽到Application的效果,需要在这个文件夹里放一个 ...

  10. Python自动化之logging模块

    Logging模块构成 主要分为四个部分: Loggers:提供应用程序直接使用的接口 Handlers:将Loggers产生的日志传到指定位置 Filters:对输出日志进行过滤 Formatter ...