- 1. Node.js异步编程的特点
- 2. 阻塞与非阻塞的实例
- 2.1 阻塞代码实例
- 2.2 非阻塞代码实例
- 3. Node.js的事件驱动
- 4. 事件循环实例
1. Node.js异步编程的特点
参考资料:http://www.runoob.com/nodejs/nodejs-callback.html
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。
例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
回调函数一般作为参数的最后一个参数出现
2. 阻塞与非阻塞的实例
参考资料:http://www.runoob.com/nodejs/nodejs-callback.html
2.1 阻塞代码实例
创建一个文件 input.txt ,内容如下:
创建 main.js 文件, 代码如下:
1 2 3 4 5 6
| var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString()); console.log("程序执行结束!");
|
以上代码执行结果如下:
1 2 3 4
| $ node main.js 菜鸟教程官网地址:www.runoob.com
程序执行结束!
|
2.2 非阻塞代码实例
创建一个文件 input.txt ,内容如下:
创建 main.js 文件, 代码如下:
1 2 3 4 5 6 7 8
| var fs = require("fs");
fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString()); });
console.log("程序执行结束!");
|
以上代码执行结果如下:
1 2 3
| $ node main.js 程序执行结束! # 写在后面的语句先执行了 菜鸟教程官网地址:www.runoob.com
|
3. Node.js的事件驱动
参考资料:http://www.runoob.com/nodejs/nodejs-event-loop.html
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)
的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
Node.js 的事件驱动程序需要引用events
模块, 通过实例化EventEmitter
类来绑定和监听事件。
4. 事件循环实例
参考资料:http://www.runoob.com/nodejs/nodejs-event-loop.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
var events = require('events');
var eventEmitter = new events.EventEmitter();
var connectHandler = function connected() { console.log('连接成功。'); eventEmitter.emit('data_received'); } eventEmitter.on('connection', connectHandler);
eventEmitter.on('data_received', function(){ console.log('数据接收成功。'); });
eventEmitter.emit('connection');
console.log('程序执行完毕。');
|
以上代码的执行结果为:
1 2 3 4
| $node main.js 连接成功。 数据接收成功。 程序执行完毕。
|