Node.js免费课程:阿里云大学——开发者班Node.js是单进程单线程的应用,但是通过事件和回调支持并发,所以性能非常高.Node.js中的每个API都是异步的,并作为单独的线程运行,使用异步函数调用并处理并发。基本上Node.js中所有的事件机制都是在设计模式中使用观察者模式来实现的。Node.js单线程类似于进入while(true)事件循环,直到没有事件观察者退出。每个异步事件都会生成一个事件观察器。如果事件发生,则调用回调函数。事件驱动Node.js使用事件驱动模型,当Web服务器收到请求时,它会关闭它并处理它,然后为下一个Web请求提供服务。当请求完成后,将其放回处理队列,当到达队列头部时,将结果返回给用户。该模型非常高效且可扩展,因为网络服务器总是在不等待任何读取或写入操作的情况下接受请求。(这也叫非阻塞IO或事件驱动IO)在事件驱动模型中,会产生一个主循环来监听事件,当检测到事件时会触发回调函数。整个事件驱动流程就是这样实现的,非常简洁。有点类似于观察者模式,一个事件相当于一个主题(Subject),所有注册到这个事件的处理者都相当于观察者(Observer)。Node.js有多个内置事件。我们可以通过引入事件模块并实例化EventEmitter类来绑定和监听事件,如下例所示://导入事件模块varevents=require('events');//创建一个eventEmitter对象vareventEmitter=新事件.EventEmitter();以下程序绑定事件处理程序://绑定事件和事件处理程序eventEmitter.on('eventName',eventHandler);我们可以通过程序触发事件://触发一个事件eventEmitter.emit('eventName');创建main.js文件实例,代码如下://导入事件模块varevents=require('events');//创建一个eventEmitter对象vareventEmitter=newevents.EventEmitter();//创建一个事件处理器varconnectHandler=functionconnected(){console.log('connectedsuccessfully.');//触发data_received事件eventEmitter.emit('data_received');}//绑定连接事件HandlereventEmitter.on('connection',connectHandler);//使用匿名函数绑定data_received事件eventEmitter.on('data_received',function(){console.log('数据接收成功');});//触发连接事件eventEmitter.emit('connection');console.log("程序执行完毕。");接下来我们执行上面的代码:$nodemain.js连接成功。数据接收成功。程序执行完毕。Node应用程序如何工作?在Node应用程序中,执行异步操作的函数将回调函数作为最后一个参数,回调函数接收一个错误对象作为第一个参数。接下来我们重温一下之前的例子,创建一个input.txt,文件内容如下:阿里云大学地址:edu.aliyun.com创建一个main.js文件,代码如下:varfs=require("fs");fs.readFile('input.txt',function(err,data){if(err){console.log(err.stack);return;}console.log(data.toString());});console.log("程序执行完成");在上面的程序中,fs.readFile()是一个读取文件的异步函数。如果在读取文件时发生错误,err对象将输出错误消息。如果没有错误,readFile会跳过err对象的输出,通过回调函数输出文件内容。执行以上代码,执行结果如下:程序执行后,阿里云大学地址:edu.aliyun.com接下来,我们删除input.txt文件,执行结果如下:程序执行后执行,Error:ENOENT,open'input.txt'因为文件input.txt不存在,所以输出错误信息。Node.js免费课程:阿里云大学-开发者班
