node.js 非阻塞型I/O及事件环机制
安装 nodejs.org
Node.js REPL(交互式解释器)
读取:读取用户输入,解析输入了javascript数据结构并存储在内存中
执行:执行输入的数据结构
打印:输出结果
循环:循环操作以上步骤直到用户两次按下ctrl+c按钮退出。
REPL 命令
-
ctrl + c - 退出当前终端。
-
ctrl + c 按下两次 - 退出 Node REPL。
-
ctrl + d - 退出 Node REPL.
-
向上/向下 键 - 查看输入的历史命令
-
tab 键 - 列出当前命令
-
.help - 列出使用命令
-
.break - 退出多行表达式
-
.clear - 退出多行表达式
-
.save filename - 保存当前的 Node REPL 会话到指定文件
-
.load filename - 载入当前 Node REPL 会话的文件内容。
回调函数
//阻塞代码实例
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序执行结束");
//非阻塞式代码实例
var fs = require("fs");
fs.readFile('input.txt',function(err,data){
if(err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束");
第一个实例在文件读取完后才执行完程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。
阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内
//事件循环
//1.引入events 模块
var events = require('events');
//2.创建 event Emitter 对象
var eventEmitter = new events.EventEmitter();
//创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功');
//触发data_received 事件
eventEmitter.emit('data_received');
}
//3.绑定事件及事件的处理程序
//绑定connection 事件处理程序
eventEmitter.on('connection',connectHandler);
//使用匿名函数绑定data_received 事件
eventEmitter.on('data_received',function(){
console.log("数据接收成功");
});
//4.触发事件
//触发connection 事件
eventEmitter.emit('connection');
console.log("程序执行完毕");
//EventEmitter 类
var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
event.on('some_event',function () {
console.log('some_event 事件触发');
});
setTimeout(function(){
event.emit('some_event');
},1000);
//EventEmitter 支持若干个事件监听器
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('someEvent',function (arg1,arg2) {
console.log('listen1',arg1,arg2);
});
emitter.on('someEvent',function(arg1,arg2){
console.log('listen2',arg1,arg2);
});
emitter.emit('someEvent','arg1参数','arg2参数');
方法 & 描述
fs.readStream对象
events.EventEmitter 实例
newListener 事件
removeListener 事件
addListener(event,listener) 为指定事件添加一个监听器到监听器数组的尾部
on(event,listener)为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器
once(event,listener) 为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
removeListener(event,listener) 移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器,它接受两个参数,第一个是事件名称,第二个是回调函数名称。
removeAllListeners([event]) 移除所有事件的所有监听器,如果指定事件,则移除指定事件的所有监听器
setMaxListeners(n) 默认情况下,EventEmitters 如果你添加的监听器超过10个就会输出警告信息。setMaxListeners 函数用于提高监听器的默认限制的数量
listeners(event) 返回指定事件的监听器数组
emit(event,[arg1],[arg2],[...]) 按参数的顺序执行每个监听器,如果事件有注册监听返回true,否则返回false
来源:https://www.cnblogs.com/lilyhomexl/p/7406117.html