node.js中对Event Loop事件循环的理解与应用实例分析_node.js

来源:脚本之家  责任编辑:小易  

一、Javascript event.srcElementevent.srcElement 可以捕获当前事件作用的对象,如event.srcElement.tagName可以捕获活动标记名称。注意获取的标记都以大写表示,如"TDwww.zgxue.com防采集请勿采集本网。

本文实例讲述了node.js中对Event Loop事件循环的理解与应用。分享给大家供大家参考,具体如下:

快:这个快有两方面,第一是V8引擎快,第二是异步执行,Node.js功能上是一个基于V8引擎的异步网络和IO Library,和Python的Twisted很像,不同的是Node.js的event loop是很底层的深入在语言中的,可以想象

javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务。

总之,通过尽量避免在Node.js中进行计算的方式,Jut团队有效提高了系统的性能。其次,关于堆栈空间问题。每当用户让Node.js服务器向其他服务器发送请求时,用户都会提供一些相应的函数,来对未来返回的

同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行。

相反的,Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常

异步任务是不进入主线程,而是进入一个 "任务队列" 里,"任务队列" 通知主线程,该异步任务才会进入主线程执行。

在你的mongodb的用户的doc里用一个array记录朋友的id,然后用$addToSet来update。如果你需要即时推送到前台,可以用socket.io;如果不需要即时,可以在前台每隔一段时间刷一次朋友的列表

任务的运行机制如下:

你运行两个fibonacciAsync()就能看出是异步的了。

1、所有同步任务在主线程上执行,形成一个 "执行栈",注意栈是先进后出的。

2、主线程外,有一个 "任务队列" ,只要异步任务处理完有结果了,就在 "任务队列" 中放置一个事件,注意队列是先进先出的。

3、一旦 "执行栈" 中所有同步任务执行完毕。系统读取 "任务队列" 中的事件,对应的异步任务。放入 "执行栈" 中,开始执行。

4、主线程不断重复第三步,这种循环从 "任务队列" 中读取事件处理的这种运行机制称为Event Loop(事件循环)。

"执行栈" 中的同步代码总是比 "任务队列"中的异步任务之前运行。

function fun() { setTimeout(function () { console.log('异步任务'); }, 0); console.log(1); console.log(2); console.log(3); console.log(4); console.log(5);}fun();

上面的代码,console.log代码写在setTimeout后面,但仍然先执行。

"任务队列" 是一个队列,队列的特性是先进先出。看下面代码:

function fun() { console.log(1); setTimeout(function () { console.log(2); setTimeout(function () { console.log(3); }, 0); }, 0); console.log(4);}fun();

输出结果为 1  4  2  3,打印 2 的setTimeout任务比打印 3 的setTimeout任务先进入队列,所以会先运行。

对于异步操作,像ajax,只有操作成功后返回结果,才会进入 "任务队列" 中,而不是调用的时候就放入队列中。看下面代码:

<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8"> <title>Title</title></head><body><script> function ajax() { var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://mail.163.com/', true); xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { console.log(xhr.responseText); } }; } function fun() { console.log(1); ajax(); setTimeout(function () { console.log(2); }, 1000); console.log(3); } fun();</script></body></html>

ajax() 与 setTimeout 谁先进入队列,谁先输出,是需要看两者消耗时间,谁更短。时间短的会先进入队列先运行。

setTimeout 与 setInterval 运行机制一样,都是在指定时间把事件插入到 "任务队列" 尾部。区别是前者只执行一次,后者可反复执行。

node.js 还为我们提供了,process.nextTick 和 setImmediate 与 "任务队列" 有关的方法。

process.nextTick 会把回调函数放在当前 "执行栈" 的尾部。也就是说是在读取 "任务队列" 之前运行。

function fun() { console.log(1); setTimeout(function () { console.log(2); }, 0); process.nextTick(function () { console.log(3); process.nextTick(function () { console.log(4); }); }); process.nextTick(function () { console.log(5); }); console.log(6);}fun();

上面的代码会输出 1  6  3  5  4  2 ,注意process.nextTick会把回调函数放在 "执行栈" 的尾部。

同步代码最先输出 1  6,然后 3 的先放入尾部,然后 5 的跟在 3 后面。3先执行,然后把 4 放入到 5 的后面。5执行完后,再执行4,最后读取 "任务队列" 中的输出2。

setImmediate 会把回调函数放在当前 "任务队列" 的尾部。也就是下一次事件循环Event Loop时执行。

function fun() { console.log(1); setTimeout(function () { console.log(2); }, 0); setImmediate(function () { console.log(3); }); console.log(4);}fun();

上面的代码是会输出 1  4  2  3 还是 1  4  3  2 是不确定的,因为setTimeout 与 setImmediate 都会在下一次事件循环Event Loop中触发,所以输出是不确定的。

希望本文所述对大家node.js程序设计有所帮助。

var EventEmitter=require('events').EventEmitter;var emitter=new EventEmitter();触发事件emitter.emit('eventname');内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 前端js中的事件循环eventloop机制详解
  • javascript中的event loop事件循环详解
  • node.js事件循环(event loop)和线程池详解
  • javascript运行机制之事件循环(event loop)详解
  • 深入理解node.js 事件循环和回调函数
  • 实例分析js事件循环机制
  • 详解nodejs异步i/o和事件循环
  • node.js中事件轮询(event loop)的解析
  • javascript中eventloop介绍
  • node.js event loop各阶段讲解
  • js单线程的本质 event loop解析
  • javascript事件循环event loop的简单模型解释与应用分析
  • node.js中的fs.write方法使用说明
  • nginx 配置多站点vhost 的方法
  • mongoose中利用populate处理嵌套的方法
  • node.js中,在cmd界面,进入退出node.js运行环境的方法
  • node.js中的fs.chownsync方法使用说明
  • node实现定时发送邮件的示例代码
  • 使用nodejs、python写的一个简易http静态文件服务器
  • 详解express + mock让前后台并行开发
  • node.js 条形码识别程序构建思路详解
  • 详解node.js中path模块的resolve()和join()方法的区别
  • node.js框架中event模块怎么引入
  • js中event.srcElement和event.target的区别
  • node.js中fs模块的文件操作有几种
  • node.js 实战上的例子为什么无法运行
  • Node.js 与 Python 作为后端服务的编程语言各有什么优劣
  • 如何更好的利用Node.js的性能极限
  • 什么是node.js的事件驱动编程
  • 在node.js的事件里添加一个小的功能-添加朋友?
  • Node.js中有个Fibonacci的异步例子,疑问process.nextTick()作用。
  • Swoole比Node.js有哪些优势?有哪些知名的Swoole案例
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础知识javascript类库表单特效广告代码网页特效黑客性质javascript技巧domnode.jsjs其它首页javascriptnode.js前端js中的事件循环eventloop机制详解javascript中的event loop事件循环详解node.js事件循环(event loop)和线程池详解javascript运行机制之事件循环(event loop)详解深入理解node.js 事件循环和回调函数实例分析js事件循环机制详解nodejs异步i/o和事件循环node.js中事件轮询(event loop)的解析javascript中eventloop介绍node.js event loop各阶段讲解js单线程的本质 event loop解析javascript事件循环event loop的简单模型解释与应用分析node.js中的fs.write方法使用说明nginx 配置多站点vhost 的方法mongoose中利用populate处理嵌套的方法node.js中,在cmd界面,进入退出node.js运行环境的方法node.js中的fs.chownsync方法使用说明node实现定时发送邮件的示例代码使用nodejs、python写的一个简易http静态文件服务器详解express + mock让前后台并行开发node.js 条形码识别程序构建思路详解详解node.js中path模块的resolve()和join()方法的区别一行命令搞定node.js 版本升级卸载安装node.js与npm过程详解node.js(安装,启动,测试)yarn的安装与使用详细介绍node.js+ajax实现获取http服务器nodejs中调用系统命令、shell脚本nodejs npm install全局安装和本nodejs基本语法和类型nodejs学习笔记之fs文件模块nodejs文件操作模块fs(file sysnodejs简单实现操作arduino详解node.js中的async和await函数简单实现nodejs上传功能node.js利用js-xlsx处理excel文件的方法详node.js sequelize如何实现数据库的读写分node.js操作mysql简单实例node.js使用免费的阿里云ip查询获取ip所在node.js的npm包管理器基础使用教程nodejs极简入门教程(三):进程node.js使用mysql连接池的方法实例
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved