Node.js两个核心特性
1. 事件驱动
2. 非阻塞I/O
- 客户端请求建立连接,提交数据等行为,会触发相应的事件。在一个时刻只能处理一个事件回调函数(单线程),处理过程中当有其它事件时,可以转而处理其它事件,然后再回来执行原事件的回调函数。
例子:快餐店点餐。你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你。收银员不能接待下一个人,除非你拿到食物离开。而现实中采用的就是事件驱动的方式:只要你把点餐单给收银员,后厨准备你的食物,而同时收银员在进行收款,当你付完钱,会给你一个号码,如果你的食物准备好了,就呼叫你的号码让你去柜台取。关键的一点是,你没有阻塞下一个客户的订餐请求(非阻塞I/O)。你订餐的食物做好的事件会导致某个人做某个动作(某个服务员喊你的订单号码,你听到你的号码被喊到去取食物),在编程领域,我们称这个为回调(callback function)。
events(事件)
- 与JavaScript中事件相似,不同的是:
Node.js中所有能触发事件的对象都是EventEmitter
类的实例,且需要使用emit
去触发
var EventEmitter = require('events').EventEmitter; //引入内置模块events并创建EventEmitter对象
var event = new EventEmitter(); // 实例化EventEmitter
event.on('test', function() { // 事件处理函数,参数分别为函数名和处理函数
console.log('test事件触发');
});
setInterval(() => {
event.emit('test'); // 触发事件
}, 1000);
VS Code插件安利——Code Runner
- 解决每次运行代码都需要终端敲命令的繁琐。
- 使用方法:
- 运行代码:双击文件选择
Run Code
- 停止运行:双击输出面板选择
Stop Code Run
- 运行代码:双击文件选择
error事件
- EventEmitter中定义的特殊事件,当程序出现错误时触发error事件,可捕获错误信息
var EventEmitter = require('events'); //引入events模块
class CustomEvent extends EventEmitter {} // 使用ES6 extends语法继承EventEmitter对象
var ce = new CustomEvent(); // 实例化
ce.on('error', err => { // 事件处理函数
console.log(err);
})
ce.emit('error', new Error('Cound not find Zander!')); // 可以传参数,此处new了一个错误
- 除此之外,events中还有许多其它方法和类方法。总之,前路漫漫兮!
- Node.js中的events