nodejs-3-细节

30 篇文章 0 订阅
6 篇文章 0 订阅
细节
1、REPL(交互式解释器)
  • REPL表示一个电脑的环境,Node自带了REPL,可以执行以下任务:读取(读取用户输入,解析输入了Javascript数据结构并存储在内存中);执行(执行输入的数据结构);打印(输出结果);循环(循环操作以上步骤直到用户退出)。
  • 可以进行简单的运算。
  • 可以将数据存储在变量中。变量声明用var关键字时,不会打印出来。
  • 多行表达式。
  • 可以使用_获取上一个表达式的运算结果。
2、回调函数
  • 回调函数在任务完成后就会被调用。Node所有API都支持回调函数。如,可以一边读取文件,一边执行其他命令,在文件读取完成后,将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件IO操作,可以处理大量并发请求。
2.1、阻塞实例

执行以下代码,读取input.txt:

var fs = require('fs');
var data = fs.readFileSync('input.txt');
console.log(data.toString);
console.log('ending.....');
  • 会发现ending的输出会在读取并打印出文本之后。
2.2、非阻塞实例
  • 执行以下代码,依旧读取input.txt:
var fs = require('fs');
fs.readFile('input.txt', function (err, data) {
	if (err) return console.error(err);
	console.log(data.toString());
});
console.log('ending...');
  • 不需要等待文件读取完成,可以再读取文件的同时执行其他操作,读取完文件执毁掉函数,即可打印出文件内容。
3、事件循环
  • nodejs是单线程单进程的应用程序,由于V8引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能会非常高。
  • nodejs基本所有的事件机制都是使用设计模式中的观察者模式实现。
  • nodejs单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
3.1、事件驱动程序
  • nodejs使用事件驱动模型(观察者观察目标,当目标发生改变,观察者可以接收到目标的改变,但是观察者的动作目标不做干涉);
  • 当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。处理完此请求后,将其放到处理队列,按照顺序返回给用户。
  • 此模型高效且扩展性强,webserver一直接收请求而不等待任何读写操作。
  • 在事件驱动模型中,会生成一个主循环来监听事件,当监听到事件时触发回调函数。
3.2、node应用程序如何工作
  • 执行异步操作的函数将回调函数作为最后一个参数,回调函数接收错误对象作为第一个参数。如上例中的读取input.txt。
  • fs.readFile()是异步函数用于读取文件,如果没发生错误,readFile就跳过err对象的输出,文件内容就通过回调函数输出。
4、EventEmitter
  • nodejs所有异步操作在完成时都会发送一个事件到事件队列。
  • nodejs里面许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
4.1、EventEmitter类
  • events模块只提供了一个对象:events.EventEmitter。EventEmitter核心就是事件触发与事件监听器功能的封装
var events = require('events');
// 创建EventEmitter对象
var eventEmitter = new events.EventEmitter();
  • eventEmitter.emit(a)代表触发事件a,触发代码块eventEmitter.on(a, function(arg1,arg2,…argn));。event对象注册了事件a的一个监听器,然后在emit()函数时向event对象发送事件a,此时会调用事件a的监听器。
  • on()函数用于绑定事件函数,emit函数用于触发一个事件。
  • event.removeListener(a, b)事件a移除回调函数(监听器)b。
  • event.removeAllListeners(a)移除所有监听器。
4.2、error事件
  • eventemitter定义了一个特殊的时间error,不需要定义关于error的回调函数,直接调用emitter.emit(‘error’);
4.3、继承EventEmitter
  • 一般在对象中继承。
5、Buffer
  • JavaScript语言自身只有字符串数据模型,并没有二进制数据类型
  • Buffer类用来专门存放二进制数据的缓冲区。
5.1、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值