Node.js 基础概念 之 回调函数

举报
bjxingch 发表于 2020/09/13 14:18:45 2020/09/13
【摘要】 Hello大家好,还记得上篇博文中,我们提到Node.js的介绍中提到的一个概念“非阻塞I/O”吗?我记得文章中提到非阻塞的实现方式就是异步编程,而提到异步,就绕不开一个概念,叫回调函数。 回调函数,我们从字面意思理解一下它,就是回头再来调用的函数,是不是?所以说回调函数在完成任务后就会被调用,在Node.js中,使用了大量的回调函数,几乎所有的API都支持回调函数,我截了个No...

       Hello大家好,还记得上篇博文中,我们提到Node.js的介绍中提到的一个概念“非阻塞I/O”吗?我记得文章中提到非阻塞的实现方式就是异步编程,而提到异步,就绕不开一个概念,叫回调函数。

       回调函数,我们从字面意思理解一下它,就是回头再来调用的函数,是不是?所以说回调函数在完成任务后就会被调用,在Node.js中,使用了大量的回调函数,几乎所有的API都支持回调函数,我截了个Node.js的API截图,大家看看规律:

大家看我上面的截图,有没有发现我勾起来的API都是一对一对的,异步的和同步的传递的参数前面的基本都是一致的,但是异步的都有callback回调函数。

       调用异步的API,比如我们截图中的fs模块里的fs.readFile(path[, options], callback)这条API,它就可以实现一遍读取文件,一遍执行其他的命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回,这样在代码执行的过程中,就没有阻塞的操作,这样的好处是可以提高Node.js的性能,处理大量的并发请求。下面我们通过两个例子,来理解一下阻塞和非阻塞代码实现起来是怎样的效果。

       阻塞代码示例(同步):

//引入fs模块
var fs = require("fs");
 
var data = fs.readFileSync('./static/test.txt');
 
console.log(data.toString());
console.log("程序执行结束!");


       非阻塞代码示例(异步):

//引入fs模块
var fs = require("fs");
 
fs.readFile('./static/test.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});
 
console.log("程序执行结束!");


       异步和同步的效果是不是很明显,从上面的截图中,我们可以明显的看出区别。第一个示例是在文件读取完成后才执行程序,二第二个示例不需要我们等待文件读取这个过程,直接运行下面的程序,当文件读取完成后,通过回调函数返回给我们需要的数据。

       所以阻塞(同步)是按代码顺序执行的,而非阻塞(异步)是不需要按照代码顺序来执行的,如果我们需要单独处理回调函数的参数,那么把相关的代码写到回调函数里即可。

 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。