node.js学习笔记(二)——回调函数
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学习笔记(二)——回调函数的更多相关文章
- Node.js自学笔记之回调函数
写在前面:如果你是一个前端程序员,你不懂得像PHP.Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择.这段时间对node.js进行了简单的学习,在这里 ...
- [转]node.js学习笔记(二)
二.express 1.安装 express4 npm --registry=http://registry.npmjs.org install -g express-generator (全局) 2 ...
- Node.js学习笔记(二) --- CommonJs和Nodejs 中自定义模块
一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一 ...
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- Node.js学习笔记(3):NPM简明教程
Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...
- Node.js学习笔记(1):Node.js快速开始
Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...
- Node.js学习笔记(4):Yarn简明教程
Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...
随机推荐
- 铁乐学python_Day44_IO多路复用
目录 IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO ...
- November 6th 2016 Week 46th Sunday
The starting point of all achievements is desire. 成功的第一步是渴望. Those who make great achievements are o ...
- 面向对象程序设计__Task3_Calculator
The initial part of the Calculator program 题目链接:Click Here github链接:Click Here 看到这个题目的话,想到就是有3个任务要去做 ...
- Java & Groovy & Scala & Kotlin - 20.Switch 与模式匹配
Overview 本章主要介绍高级条件语句中的 switch 语句以及其增强版的模式匹配. Java 篇 Switch 特点 Java 中 switch 语句功能类似 if,但是 switch 主要用 ...
- openssl生成证书
数字证书: 第三方机构使用一种安全的方式把公钥分发出去 证书格式:x509,pkcs家族 x509格式: 公钥和有效期限: 持有者的个人合法身份信息:(主机名,域名) 证书的使用方式 CA的信息 CA ...
- 8 个不常见但很有用的 Git 命令
1. 拉取远程代码并且覆盖本地更改 2. 列出远程和本地所有分支 3. 强制更新远程分支 4. 回滚一个 merge 5. 修改之前的提交记录或者很久前提交的记录 6. 使用多个远程代码库,并且使用多 ...
- 列表中不限制宽度,hover时,字体font-weight:bold,防止抖动
项目一个小问题困扰了很久,在一个没有限制宽度的列表容器中,如果给hover时,给字体➕'font-wieght:bold'容器就会变宽,然后移动的下一个容器,就会出现抖动,这样很是影响用户体验,于是在 ...
- python+requests实现接口测试 - cookies的使用
在很多时候,发送请求后,服务端会对发送请求方进行身份识别,如果请求中缺少识别信息或存在错误的识别信息, 会造成识别失败. 如一些需要用户登录以后才能访问的页面. import requests mya ...
- 【转】Tomcat 9.0安装配置
本文转自:http://blog.sina.com.cn/s/blog_15126e2170102w5o8.html 一.JDK的安装与配置 1.从官网下载jdk,注意是jdk不是jre.最好从官网下 ...
- 【LeetCode415】Add Strings
题目描述: 解决思路: 此题较简单,和前面[LeetCode67]方法一样. Java代码: public class LeetCode415 { public static void main(St ...