Node.js - 回调函数,事件驱动

【Node.js的简要介绍,保证被问得时候说出点东西出来,嘿嘿~~~】
简单说 ,Node.js就是运行在服务器端的Javescript【js之前一直是运行在浏览器端的最基础的网络脚本语言】
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个 事件驱动I/O服务端 JavaScript环境,
基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

【Node.js的单线程、非阻塞I/O、事件驱动】
在 Java/php/.net等服务器端语言中,会为每一个客户端创建一个新的线程,而每个线程需要耗费大约2MB的内存,也就是说,理论上,一个8GB的内存服务器可以同时连接的最大用户数为4000个左右,要让web应用程序支持更多的用户,就需要增加服务器的数量,而web应用程序的硬件成本当然就上升了。
但是Node.js 不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞 I/O事件驱动机制,让 Node.js 程序宏观上也是并行的。使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。

【为啥Node.js是非阻塞I/O(异步I/O)?】
什么是非阻塞?简明的说就是我们在执行一系列的操作的时候,不必等,不需要等上一个操作结束再开始下一步操作。好比如说,我们可以一边读取文件,一边执行其他的命令。等文件读取完毕之后,可以通过回调函数将结果作为参数返回。这样在执行代码的时候哦就没有阻塞(阻塞就是代码的顺序执行)
而Node.js是单进程单线程的应用程序,又是基于chrome的V8引擎,V8引擎提供的异步执行回调接口,这些接口可以处理大量的并发,所以性能非常高。Node.js 几乎每一个 API 都是支持回调函数的。所以Node.js可以处理高并发的请求,性能很高。

针对Node.js中程序的异步操作,咋处理?处理异步操作,目的就是要让程序同步,按顺序执行,下一步的代码执行,建立在前一步的异步操作结果之上,不能等,所以必须处理异步操作!
【Node.js的异步编程】—— 回调 (直接体现)
通过一个简单的例子感受,回调函数处理异步函数:

//错误的写法:
function getData(){
 //模拟请求数据
 	var result=' ';
 	// setTimeout是异步操作,非阻塞
 	setTimeout(function(){
		 result='这是请求到的数据'  
	 },200);
	 return result;
}
console.log(getData());/*异步导致请求不到数据*/

// 正确处理异步
function getData( callback ){
 //模拟请求数据
 	var result=' ';
 	// setTimeout是异步操作,非阻塞
 	setTimeout(function(){
		 result='这是请求到的数据'  
		 callback(result)
	 },200);
}
getData(function(data){
	console.log(data)
})

【Node.js的异步编程】—— EventEmitter(Node events 模块 )
Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,通过事件监听处理异步操作:

// 引入 events 模块
var events = require('events');
var EventEmitter=new events.EventEmitter(); /*实例化事件对象*/

// 监听 ‘toparent’ 事件,接收广播,调用回调函数,这就是事件驱动
EventEmitter.on('toparent',function(){
 	console.log('接收到了广播事件');  
})

setTimeout(function(){
	console.log('广播');
	 EventEmitter.emit('toparent'); /*发送广播 ,触发事件*/
},1000)

可以通过广播 将异步操作的数据结果广播出去,通过监听广播来接收数据,进行数据的操作。【事件驱动:监测到事件的时触发回调函数】
上面通过 events.EventEmitter 处理异步操作的运行结果是:会在1秒后,控制台先打印出“广播”,然后 触发“toparent”事件,再打印出“接收到了广播事件”

所以在 封装异步操作的时候,可以将结果通过 callback(result) 回调函数 或者 Emitter.emit(“xx”,result) 事件触发,把结果传递出去。

完结~~如果自己的理解有误,请多多指教!

猜你喜欢

转载自blog.csdn.net/Zhou07182423/article/details/87874683