手机版

对Node.js事件循环和回调函数的深刻理解

时间:2021-09-13 来源:互联网 编辑:宝哥软件园 浏览:

文中详细介绍了Node.js事件循环和Node.js回调函数,不多废话,请参考下文。

1.Node.js事件周期

Node.js是一个单进程单线程的应用程序,但是它通过事件和回调支持并发,所以它的性能非常高。Node.js的每个API都是异步的,并且作为独立的线程运行,使用异步函数调用并处理并发性。基本上,Node.js的所有事件机制都是由设计模式中的观察者模式实现的。Node.js的单个线程类似地进入while(true)事件循环,直到没有事件观察器退出,并且每个异步事件生成一个事件观察器。如果发生事件,将调用回调函数。

1.事件驱动程序

Node.js使用事件驱动模型。当web服务器收到请求时,它会关闭请求,然后处理它,然后服务下一个web请求。当请求完成时,它被放回处理队列,当它到达队列的开头时,结果被返回给用户。这种模型非常高效且可扩展,因为web服务器总是接受请求,而无需等待任何读写操作。(这也称为非阻塞IO或事件驱动IO)。在事件驱动模型中,生成一个主循环来监听事件,并在检测到事件时触发回调函数。

整个事件驱动过程就是这样实现的,非常简洁。类似于观察者模式,一个事件相当于一个主体,在这个事件上注册的所有处理功能都相当于观察者。Node.js中有很多内置事件我们可以通过引入events模块和实例化EventEmitter类来绑定和监控事件,如下例所示:

//引入事件模块var events=require(' events ');//创建eventEmitter对象var event emitter=new events . event emitter();下列程序绑定事件处理程序://bind事件和事件处理程序eventemitter.on ('eventname ',event handler);我们可以通过程序://触发事件eventEmitter.emit('eventName ')来触发事件;2.例子

使用以下代码创建main.js文件:

//引入事件模块var events=required(' events ');//创建eventEmitter对象var event emitter=new events . event emitter();//创建事件处理程序var connect handler=function connected(){ console . log('连接成功。);//触发data_received事件event emitter . emit(' data _ received ');}//绑定连接事件处理程序eventemitter.on ('connection ',connect handler);//使用匿名函数绑定data _ received event emitter . on(' data _ received ',函数(){console.log('数据接收成功')。);});//触发连接事件event emitter . emit(' connection ');Console.log('程序执行完毕。);

第二,Node.js回调函数

Node.js异步编程的直接体现就是回调。异步编程依赖回调,但不能说回调后程序就变成异步了。完成任务后将调用回调函数。Node使用了大量的回调函数,Node的所有API都支持回调函数。例如,我们可以同时读取文件和执行其他命令。文件被读取后,我们返回文件的内容作为回调函数的参数。这样,在执行代码时就没有阻塞或等待文件I/O操作。这大大提高了Node.js的性能,可以处理大量并发请求。

1.阻塞代码示例

创建一个包含以下内容的文件test.txt:

你好世界!文件test.js由fs.readFileSync()和fs.readFile()创建,代码如下:

console . log('-);//引入fs模块var fs=required(' fs ');//同步读取文件vardata=fs . readfilesync(' test . txt ',' utf-8 ');console . log(data . tostring());console . log('-);上述代码的执行结果如下:

2.非阻塞代码示例

使用以下代码创建一个test.js文件:

console . log('-);//引入fs模块var fs=required(' fs ');//异步读取文件fs.readfile ('test.txt ',' utf-8 ',函数(err,data){ if(err)return console . err(err);console . log(data . tostring());});console . log('-);在上面的程序中,fs.readFile()是一个读取文件的异步函数。如果在读取文件的过程中出现错误,error对象将输出一条错误消息。如果没有出现错误,readFile跳过err对象的输出,通过回调函数输出文件内容。

上述代码的执行结果如下:

接下来,我们删除input.txt文件,执行结果如下:

在上面两个例子中,我们知道了阻塞调用和非阻塞调用的区别。在读取文件之前,第一个实例不会完成程序的执行。在第二个例子中,我们不需要等待文件被读取,所以我们可以在读取文件的同时执行以下代码,这大大提高了程序的性能。因此,阻塞是按顺序执行的,而非阻塞不需要按顺序执行,所以如果我们需要处理回调函数的参数,就需要把它们写在回调函数中。

Iii .fs.readFileSync和fs.readFile

1、s.readFileSync

语法:fs.readfilesync(文件名,[编码])

接收参数:

文件名:文件路径

Options:option对象,包括编码和编码格式,可选。

由于Node.js只支持以下代码:utf8、ucs2、ascii、二进制、base64、十六进制,不支持中文GBK或GB2312等代码,如果要读写GBK或GB2312格式文件的中文内容,必须使用额外的模块:iconv-lite。

2、fs.readFile

语法:fs.readfile(文件名,[编码],[回调(err,data)])

接收参数:

文件名:文件路径

Options :option对象,包括编码和编码格式,可选。

回调:回调,传递两个参数:异常错误和文件内容数据

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:对Node.js事件循环和回调函数的深刻理解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。