重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍了JavaScript中Event Loop指的是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
目前创新互联建站已为千余家的企业提供了网站建设、域名、雅安服务器托管、网站托管、企业网站设计、云龙网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
什么是Event Loop?
js的单线程是他的任务栈是单线程,但他处理异步i/o的方法是依赖libuv开启线程池去处理,完成之后任务加到poll queue里,然后等任务栈的任务为空或事件到达阀值时,把poll queue和定时器的任务加到任务栈里,继续这个循环,这就是大体上的js的Event Loop。
结构
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
timer:
定时任务,当到达阀值时,他不会立即执行,会等待任务栈的任务会阻塞他。
pending callbacks:
此阶段执行某些系统操作(例如TCP错误类型)的回调。例如,如果TCP套接字在尝试连接时收到,则某些*nix系统希望等待报告错误。这将排队等待在挂起的回调阶段执行。
pull:
这个阶段有两个主要功能:
计算它应该阻塞和轮询I / O的时间,然后
处理轮询队列中的事件。
当事件循环进入轮询阶段并且没有计划定时器时,将发生以下两种情况之一:
如果轮询队列不为空,则事件循环将遍历其同步执行它们的回调队列,直到队列已用尽,或者达到系统相关的硬限制。
如果轮询队列为空,则会发生以下两种情况之一:
如果脚本已执行setImmediate,则事件循环将结束poll阶段并继续执行check阶段以执行这些调度脚本。
如果脚本没有执行setImmediate,事件循环将等待回调被添加到poll queue中,然后立即执行。
一旦poll queue为空事件循环将检查timer,如果一个或多个定时器准备就绪,事件循环将回绕到timer阶段以执行那些timer的回调。
check
此阶段允许人员在轮询阶段完成后立即执行回调 。如果轮询阶段变为空闲并且存在setImmediate任务,那么事件循环直接跳到check执行而不是阻塞在poll阶段等待回调被加入。
setImmediate实际上是一个特殊的计时器,它在事件循环的一个单独阶段运行。它使用libuv API来调度在轮询阶段完成后执行的回调。
close callbacks
如果socket或handle突然关闭(例如socket.destroy()),则该 'close'事件将在此阶段发出。否则它将通过发射process.nextTick()。
感谢你能够认真阅读完这篇文章,希望小编分享JavaScript中Event Loop指的是什么内容对大家有帮助,同时也希望大家多多支持创新互联,关注创新互联行业资讯频道,遇到问题就找创新互联,详细的解决方法等着你来学习!