Node.js回调函数
参考https://www.runoob.com/nodejs/nodejs-callback.html
- Node.js异步编程的直接体现就是回调。
- 异步编程依托于回调来实现,回调!=异步化
- Node.js所有的API都支持回调函数。
异步函数实现的原理:
1. 在普通函数的最后一个参数传入另一个函数,这个函数就会在当前函数执行完毕后被执行
2. 当前函数的结果可以当作另一个函数的参数,从而处理大量并发请求
阻塞代码实例
准备一个文本文件,例如input.txt,内容如下:
菜鸟教程官网地址:www.runoob.com
创建一个main.js文件,代码如下:
var fs = require('fs');
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log('程序执行结束!');
控制台输入node main.js,代码执行结果:
菜鸟教程官网地址:www.runboo.com
程序执行结束!
其中,fs模块为Node.js操作文件系统(FileSystem,简称fs)的必要模块(required模块),由于读取文件返回的为一个Buffer对象,所以需要调用该对象的toString()方法,如果不加toString(),结果为:
可以看到由于使用了同步读取文件的函数readFileSync(),程序是按顺序执行的,由于读取文件时发生了阻塞,所以需要等待文件读取操作结束后,才会继续向下执行。
非阻塞代码实例
文本文件还使用上一个input.txt,修改main.js为:
var fs = require('fs');
fs.readFile('input.txt', function(err, data){
if(err){
return console.error(err);
}
console.log(data.toString());
});
console.log('程序执行结束!');
执行结果:
程序执行结束!
菜鸟教程官网地址:www.runoob.com
可以看到,由于使用了异步读取文件的函数readFile(),程序并没有按顺序执行,而是在等待文件读取的同时,就继续向下执行并把'程序执行结束!'打印到了控制台,最后才是执行回调函数中打印读取的文件的部分。