nodejs中事件循环机制的示例分析

  介绍

这篇文章主要介绍了nodejs中事件循环机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

前端开发离不开JavaScript, JavaScript是一种web前端语言,主要用网络开于发中,由浏览器解析执行。而js的作用不仅仅局限于前端领域的开发,它同样可以用于服务端开发——nodejs。作为一名有理想抱负的前端,想要拓展视野,掌握一门服务器端开发语言,那么nodejs是非常好的一种选择。

因为你掌握了js开发方式就很容易上手节点,并且npm包管理工具也大大提升了开发体验.nodejs以异步非阻塞I/O工作方式而闻名,其处理机制被称为事件循环。

了解节点事件循环机制就能更好的了解节点的事件处理方式以及异步事件的执行时机,本文主要讲解一下nodejs的事件循环机制,为后续学习节点奠定基础。

<强>一、节点和JavaScript

前面提到,JavaScript是一种web前端语言,主要用网络开于发中,由浏览器解析执行,而节点。js是一个基于Chrome V8引擎的JavaScript运行环境,因此nodejs不是一门语言,不是库,不是框架,而是一个js运行时环境,简单讲节点可以解析和执行js代码。以前只有浏览器可以解析执行js,现可在节点以使js完全脱离浏览器来运行。

节点。js和浏览器js存在很多区别,比如浏览器中的js包括了ecmascript, BOM, DOM,但是nodejs中的js没有BOM, DOM,只有emcscript。并且节点这个js执行环境为js提供了一些服务器级别的操作API,例如:文件读写,网络服务构建,网络通信,http服务器等,这大些API都被包装到核心模块里面了。另外节点的事件循环机制和浏览器js的事件循环机制也不一样。

<强>二,JavaScript事件循环

大家对浏览器中的js事件循环已经很清楚了,为了对比这里简单再提一下。

 nodejs中事件循环机制的示例分析

(转引自菲利普·罗伯茨的演讲《帮助,我# 39;米卡在一个事件循环》)

js执行时同步和异步任务任务分别进入不同的执行环境,同步任务的进入主线程,即主执行栈,异步任务(ajax请求,settimeout, setinterval, poromise.resolve()等)进入任务队列。不同的异步任务会推入不同的任务队列,比如ajax请求,settimeout, setinterval等这些任务会被推入进宏任务队列(宏观任务),而保证函数则会被推到微任务队列(微任务)。整体的事件循环过程如下:

<李>

当同步代码执行完后,主执行栈变空,开始准备执行异步任务。

<李>

主线程会检查微任务队列是否为空,如果不为空那么会遍历队列内的所有微任务将其执行完,清空微任务队列,然后再检查宏任务队列。如果微任务队列是空的,直接进入下一步。

<李>

主线程遍历宏任务队列,并执行宏任务队列中的第一个宏任务,在执行的过程中如果遇到宏任务或者微任务,则继续将他们推入到对应的任务队列,每次执行完一次宏任务都要遍历执行一下微任务队列,将其清空

<李>

执行渲染操作,更新视图

<李>

开始下一次的事件循环,重复上述步骤直至两个任务队列清空

为了加深一下影响,举一个小小的,看看以下代码会输出什么:

,,,,var  le=Promise.resolve (2);   ,,,console.log (le)   ,,,console.log (& # 39; 3 & # 39;   ,,,Promise.resolve(),然后(()=祝辞{   ,,,console.log (& # 39; Promise1& # 39;),,   ,,,setTimeout(()=祝辞{   ,,,,,,,console.log (& # 39; setTimeout2& # 39;)   ,,,},0)   ,,,})   ,,,setTimeout(()=祝辞{   ,,,console.log (& # 39; setTimeout1& # 39;)   ,,,Promise.resolve(),然后(()=祝辞{   ,,,,,,,console.log (& # 39; Promise2& # 39;),,,,   ,,,})       },0);

用以上的事件循环过程分析一下:

  • js主进程执行代码遇到Promise.resolve(2),会立即执行,将2变成一个promise对象,然后console.log(le)将le变量打印出来,打印----->Promise {: 2};

  • console.log('3'),打印----->3

  • 接着往下执行遇到Promise.resolve().then,这是一个异步微任务函数,推到微任务栈

  • 下一个函数遇到setTimeout,推到宏任务队列,至此主进程空了

  • 检查微任务队列,发现Promise.resolve().then,所以打印----->promise1,又遇到一个定时器,推至宏任务队列的最后,微任务队列空了

    nodejs中事件循环机制的示例分析