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可以看到如下结果。

 

posted @ 2018-12-27 18:05  Allen●J  阅读(1396)  评论(0编辑  收藏  举报