Nodejs - 事件和函数
前面我们已经配置好了Nodejs的环境。接下来我们可以使用node做一些事情。
我们可以在Nodejs 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 会话的文件内容。
接着我们就可以进入node,使用node命令进入node 命令输入窗口,我们可以发现左侧的 > ,我们就可以输入运算 10 + 10 回车可以得到运行结果
我们也可以像在Javascript中定义变量。var x = 10 , 接着 console.log 输出x变量的值 ,。
我们还可以输入多行表达式,这点类似Javascript。。。。三个点是系统自动生成的。Node会自动检测是否为连续表达式。
$ node > 10 + 10 undefined 20> var x = 10
undefined> console.log(x) 10 undefined
> do {
... x++;
... console.log("x: " + x);
... } while ( x < 5 );
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
Nodejs 回调函数
Nodejs 异步变成的直接体现就是回调。异步编程依托于回调来实现。但不能说使用了回调函数程序就异步化了。
回调函数在完成任务后就会被调用。Node大量使用了回调函数。Node所有的API都支持回调函数。回调函数一般作为函数的最后一个参数出现。
//同步代码实例
//创建一个文件 input.txt ,内容如下: This is input text file
//创建input.js与input.txt同级 var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("Game Over!");
我们可以发现输出结果的顺序是:
那我们使用异步代码会出现什么样的结果勒?
var fs = require("fs");
var data = fs.readFile("input.txt",function(err,data){
if(err){
console.error(err);
}
console.log(data.toString());
});
console.log("Game Over!");
我们发现Game Over先输出。应为readFile并不会阻塞程序。向下执行。当readyFile获取到结果之后会调用回调函数输出input.txt 内容
事件循环
由于Nodejs是单进程单线程引用程序。但应为V8引擎提供的回调函数。通过这些接口可以处理大量的并发,所以性能非常高。
单线程类似进入while(true) 的事件循环。知道没有事件观察者则退出。因为每一个时间都会生成一个时间观察者。如果有时间发生就调用回调函数
Nodejs使用时间驱动模型,当web server 接收到请求,就会把它关闭然后进行处理。接着去服务下一个web请求,当这个请求完成。就会放回处理队列中。当达到队列开头结果就会返回给用户。
这个模型非常高效,扩展性非常强。应为web server不等待任何读写,也不等待操作完成。此模型被称为非阻塞/驱动IO
Nodejs有多个内置时间。都是用过EventEmitter类来绑定和监听时间。EventEmitter 存在于events模块中。所以我们想要使用EventEmitter 对象我们需要引入event模块
// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
接下来我们就可以把时间绑定到eventEmitter中。 并可以通过emit方法出发事件。
// 绑定事件及事件的处理程序 eventEmitter.on('eventName', function(){
//process function here.
}); // 触发事件 eventEmitter.emit('eventName');
创建event.js如下:
var events = require("events"); var eventEmitter = new events.EventEmitter(); eventEmitter.on('connectionWebSocket',function(){ console.log('connection to websocket'); eventEmitter.emit('openWebSocket'); }); eventEmitter.on('openWebSocket',function(){ console.log('open websocket'); }); eventEmitter.emit('connectionWebSocket'); console.log('Connection Finished.');
我们通过node event.js可以看到如下结果。