首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Node.js中的事件循环定时器和process.nextTick()

原文链接 什么是事件循环 虽然js是单线程的,但是事件循环会尽可能地将异步操作(offloading operations)托付给系统内核,让node能够执行非阻塞的I/O操作 由于大多数现代内核都是多线程的...事件循环的定义 当Node.js服务启动时,它就会初始化事件循环。...每当处理到脚本(或者是放置到REPL执行的代码,本文咱不提及)中异步的API, 定时器,或者调用process.nextTick()都会触发事件循环, 下图简单描述了事件循环的执行顺序 ┌────...在任意两个阶段之间,Node.js都会检查是否还有在等待中的异步I/O事件或者定时器,如果没有就会干净得关掉它。...,如果有定时器准备好了,那么事件循环将会回到timers阶段去执行定时器的回调 check 这个阶段允许开发者在poll阶段执行完成后立即执行回调函数。

2.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试官:说说Event Loop事件循环、微任务、宏任务

    事件循环Event Loop概念介绍事件循环Event Loop又叫事件队列,两者是一个概念事件循环指的是js代码所在运行环境(浏览器、nodejs)编译器的一种解析执行规则。...事件循环不属于js代码本身的范畴,而是属于js编译器的范畴,在js中讨论事件循环是没有意义的。换句话说,js代码可以理解为是一个人在公司中具体做的事情, 而 事件循环 相当于是公司的一种规章制度。...6.执行微任务代码7.微任务代码执行完毕,本次队列清空寻找下一个宏任务,重复步骤1以此反复直到清空所以宏任务,这种不断重复的执行机制,就叫做事件循环画了一张图来描述事件循环图片4.易错点(1). promise...事件循环不属于js代码本身的范畴,而是属于js编译器的范畴,在js中讨论事件循环是没有意义的。换句话说,js代码可以理解为是一个人在公司中具体做的事情, 而 事件循环 相当于是公司的一种规章制度。...6.执行微任务代码7.微任务代码执行完毕,本次队列清空寻找下一个宏任务,重复步骤1以此反复直到清空所以宏任务,这种不断重复的执行机制,就叫做事件循环画了一张图来描述事件循环参考 前端进阶面试题详细解答图片

    75940

    面试官:说说Event Loop事件循环、微任务、宏任务

    同步任务:即主线程上的任务,按照顺序由上⾄下依次⾏,当前⼀个任务⾏完毕后,才能⾏下⼀个任务。异步任务:不进⼊主线程,⽽是进⼊任务队列的任务,执行完毕之后会产生一个回调函数,并且通知主线程。...事件循环Event Loop概念介绍事件循环Event Loop又叫事件队列,两者是一个概念事件循环指的是js代码所在运行环境(浏览器、nodejs)编译器的一种解析执行规则。...事件循环不属于js代码本身的范畴,而是属于js编译器的范畴,在js中讨论事件循环是没有意义的。换句话说,js代码可以理解为是一个人在公司中具体做的事情, 而 事件循环 相当于是公司的一种规章制度。...6.执行微任务代码7.微任务代码执行完毕,本次队列清空寻找下一个宏任务,重复步骤1以此反复直到清空所以宏任务,这种不断重复的执行机制,就叫做事件循环画了一张图来描述事件循环图片更多面试题解答参见 前端进阶面试题详细解答...执行Promise的then方法里的代码,打印63.微任务执行完毕后,最后执行定时器里的宏任务,打印2,3,4三.图片1.先执行主线程上的同步代码,打印12.执行第9行的函数,进⼊async1内部,async1

    2.3K31

    面试官:说说Event Loop事件循环、微任务、宏任务5

    同步任务:即主线程上的任务,按照顺序由上⾄下依次⾏,当前⼀个任务⾏完毕后,才能⾏下⼀个任务。异步任务:不进⼊主线程,⽽是进⼊任务队列的任务,执行完毕之后会产生一个回调函数,并且通知主线程。...事件循环Event Loop概念介绍事件循环Event Loop又叫事件队列,两者是一个概念事件循环指的是js代码所在运行环境(浏览器、nodejs)编译器的一种解析执行规则。...事件循环不属于js代码本身的范畴,而是属于js编译器的范畴,在js中讨论事件循环是没有意义的。换句话说,js代码可以理解为是一个人在公司中具体做的事情, 而 事件循环 相当于是公司的一种规章制度。...6.执行微任务代码7.微任务代码执行完毕,本次队列清空寻找下一个宏任务,重复步骤1以此反复直到清空所以宏任务,这种不断重复的执行机制,就叫做事件循环画了一张图来描述事件循环图片4.易错点(1). promise...执行Promise的then方法里的代码,打印63.微任务执行完毕后,最后执行定时器里的宏任务,打印2,3,4三.图片参考 前端进阶面试题详细解答1.先执行主线程上的同步代码,打印12.执行第9行的函数

    77320

    说说Event Loop事件循环、微任务、宏任务

    同步任务:即主线程上的任务,按照顺序由上⾄下依次⾏,当前⼀个任务⾏完毕后,才能⾏下⼀个任务。异步任务:不进⼊主线程,⽽是进⼊任务队列的任务,执行完毕之后会产生一个回调函数,并且通知主线程。...事件循环Event Loop概念介绍事件循环Event Loop又叫事件队列,两者是一个概念事件循环指的是js代码所在运行环境(浏览器、nodejs)编译器的一种解析执行规则。...事件循环不属于js代码本身的范畴,而是属于js编译器的范畴,在js中讨论事件循环是没有意义的。换句话说,js代码可以理解为是一个人在公司中具体做的事情, 而 事件循环 相当于是公司的一种规章制度。...6.执行微任务代码7.微任务代码执行完毕,本次队列清空寻找下一个宏任务,重复步骤1以此反复直到清空所以宏任务,这种不断重复的执行机制,就叫做事件循环画了一张图来描述事件循环图片4.易错点(1). promise...执行Promise的then方法里的代码,打印63.微任务执行完毕后,最后执行定时器里的宏任务,打印2,3,4三.图片参考 前端进阶面试题详细解答1.先执行主线程上的同步代码,打印12.执行第9行的函数

    71620

    面试官:说说Event Loop事件循环、微任务、宏任务_2023-02-28

    同步任务:即主线程上的任务,按照顺序由上⾄下依次⾏,当前⼀个任务⾏完毕后,才能⾏下⼀个任务。异步任务:不进⼊主线程,⽽是进⼊任务队列的任务,执行完毕之后会产生一个回调函数,并且通知主线程。...事件循环Event Loop概念介绍事件循环Event Loop又叫事件队列,两者是一个概念事件循环指的是js代码所在运行环境(浏览器、nodejs)编译器的一种解析执行规则。...事件循环不属于js代码本身的范畴,而是属于js编译器的范畴,在js中讨论事件循环是没有意义的。换句话说,js代码可以理解为是一个人在公司中具体做的事情, 而 事件循环 相当于是公司的一种规章制度。...6.执行微任务代码7.微任务代码执行完毕,本次队列清空寻找下一个宏任务,重复步骤1以此反复直到清空所以宏任务,这种不断重复的执行机制,就叫做事件循环画了一张图来描述事件循环图片4.易错点(1). promise...执行Promise的then方法里的代码,打印63.微任务执行完毕后,最后执行定时器里的宏任务,打印2,3,4三.图片参考 前端进阶面试题详细解答1.先执行主线程上的同步代码,打印12.执行第9行的函数

    87510

    Node.js的事件循环(Event loop)、定时器(Timers)和 process.nextTick()

    事件循环解析 在 Node.js 启动的时候,一步步地做了:初始化事件循环,处理可能包含异步 API 调用的输入脚本(用户代码)(或进入 REPL,这里不讲 REPL),调度定时器,或者调用 process.nextTick...实际上有七到八个步骤,但是我们关心的、Node.js 真正用到的这里都讲到了。 事件循环阶段一览 定时器:这一阶段执行由 setTimeout() 和 setInterval() 设置的回调。...在事件循环的每次运行之间, Node.js 会检查是否在等待任何异步 I/O 或定时器,如果两个都没有就自动关闭。...一旦轮询队列为空,事件循环将检查是否有阈值到达了的定时器,如果有,事件循环将返回到定时器阶段来执行这些定时器的回调。 check 这个阶段允许我们在轮询阶段完成后立刻执行一些回调。...例如,如果我们在一个 I/O 循环之外(即主模块)运行以下代码,这两个定时器被执行的顺序是不确定的,这要看进程的性能: // timeout_vs_immediate.js setTimeout(()

    1.5K30

    【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环定时器和process.nextTick

    事件循环是Node.js能够实现非阻塞I/O的基础,尽管JavaScript应用是单线程运行的,但是它可以将操作向下传递到系统内核去执行。...API调用,定时器,或process.nextTick方法调用,然后就会开始处理事件循环(Event Loop)。...在每轮事件周期之间,Node.js会检查是否有处于等待中的异步I/O或定时器,如果没有的话就会关闭当前程序。...注意:为了避免在poll阶段阻塞事件循环,libuv(Node.js底层用于实现事件循环和异步特性的C语言库)设置了一个硬上限值(该值会根据系统不同而有变化),使得poll阶段只能将有限数量的回调函数添加进...一旦poll队列为空,事件循环就会检查是否有已经到期的timers定时器,如果有一个或多个定时器到期,事件循环就会回到timers阶段来执行这些定时器的回调函数。

    1.2K30

    web前端开发初学者十问集锦(3)

    9.js无限循环定时器会执行吗? 这里涉及到window.setTimeOut和window.setInterval的异步性,以及js单线程的单线程问题。经常会出现在面试的过程中。...true; window.setTimeout(function (){ t = false; },1000); while (t){} alert('end'); 请问alert会执行吗...答案是死循环导致setTimeout不执行,也导致alert不执行。 js是单线程是对的,所以会先执行while(t){}再alert,但这个循环体是死循环,所以永远不会执行alert。...至于说为什么不执行setTimeout,是因为js的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的...简单的来说就是定时器时异步加载的,而js是单线程的,在声明一个定时器之后,这个定时器会暂时保存在任务队列中,当js的同步代码加载完毕之后再执行任务队列中异步的定时器

    1.6K20

    【RTOS训练营】上节回顾、内部机制、中断管理和晚课提问

    二:内部机制 在定时器任务阻塞的期间, 1.如果别的任务发来了定时器的各种命令:定时器任务会即刻被唤醒、去处理 2.如果一直没有别的任务发来定时器的各种命令,超时时间到了,定时器任务也被唤醒 这时候他就会去调用超时的...所以中断函数要尽快执行完 在中断函数执行的期间,任务是无法执行的 不论从哪一个角度来看,中断函数都要尽快执行完 我们从头来讲吧,从头讲中断的处理过程: 1.task1正在运行,pxCurrentTCB向...1.task1正在运行,pxCurrentTCB向task1 2.按下GPIO按键,产生中断 3.task1的现场,被保存在task1的栈里 4.CPU使用另一个栈,就是中断的栈,开始执行中断函数 5...问 :tick中断 比 exti0的优先级更高,能够运行吗?...死循环吗?还是被别的中断打断 答: 中断不会自己阻塞,之所以这样说是为了跟任务做一个对比 任务:可以自己阻塞 中断:不可以自己阻塞,没这个功能 6.

    81330

    2023秋招前端面试必会的面试题_2023-02-28

    通过创建 Vue 组件,我们可以将接口的可重复部分及其功能提取到可重用的代码段中。仅此一项就可以使我们的应用程序在可维护性和灵活性方面走得更远。...我了解的预加载的最常用的方式是使用 js 中的 image 对象,通过为 image 对象来设置 scr 属性,来实现图片的预加载。...⽤户浏览器接收到响应后解析⾏,混在其中的恶意代码也被⾏。 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝⾏攻击者指定的操作。...⽤户浏览器接收到响应后解析⾏,混在其中的恶意代码也被⾏。 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝⾏攻击者指定的操作。...⽤户浏览器接收到响应后解析⾏,前端 JavaScript 取出 URL 中的恶意代码并⾏。 恶意代码窃取⽤户数据并发送到攻击者的⽹站,或者冒充⽤户的⾏为,调⽤⽬标⽹站接⼝⾏攻击者指定的操作。

    83020

    阿里前端常考面试题汇总

    (3)时间触发线程 时间触发线程属于浏览器而不是JS引擎,用来控制事件循环;当JS引擎执行代码块如setTimeOut时(也可是来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件触发线程中...;(4)定时器触发进程 定时器触发进程即setInterval与setTimeout所在线程;浏览器定时计数器并不是由JS引擎计数的,因为JS引擎是单线程的,如果处于阻塞线程状态就会影响记计时的准确性;...因此使用单独线程来计时并触发定时器,计时完毕后,添加到事件队列中,等待JS引擎空闲后执行,所以定时器中的任务在设定的时间点不一定能够准时执行,定时器只是在指定时间点将任务添加到事件队列中;注意:W3C在...对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。...行行,且应该在 then ⽅方法被调⽤用的那⼀一轮事件循环之后的新⾏行行栈中⾏行行。

    1.4K40

    埋点统计优化,首屏加载速度提升

    埋点统计在我们业务里经常有遇到,或者很普遍的,我们自己网站也会加入第三方统计,我们会看到动态加载方式去加载jsdk,也就是你常常看到的insertBefore操作,我们很少考虑到为什么这么做,直接同步加载不行吗...Math.ceil((endTime - startTime) / 1000)}s后执行的`) 最后看下打印结果 所以可以证实,onload是会等资源下载完了后,才会立即触发 所以我们回头来看 在浏览器的事件循环中...,我同步方式引入不行吗?不要定时器又会有什么样的结果?...同步加载(1846ms) 我们发现tj.js与app.js相隔的时间很少,且我们从火焰图中分析看到,Summary的数据是1846ms 综上比较,虽然同步加载依然比不上使用定时器的加载方式,使用定时器相比较同步加载...3、不使用定时器+insertBefore 执行顺序:app.js->tj.js 当我们知道在1中,app.js优先于tj.js 因为insertBefore就是一种异步动态加载方式 举个例子 <script

    90620

    【JavaScript】 进阶教程 施工中~

    函数嵌套,内部函数引用了外部函数的数据(变量/函数) 如上图所示,可通过chrome调试模式查看Closure(闭包),当内部行函数定义(并不是调用函数)时就产生了闭包。...(内存中的对象) ​ 分线程: ​ 定时器模块:负责定时器的管理 ​ DOM事件响应模块:负责事件的管理 ​ 网络请求模块:负责ajax请求 ​ 其它模块:… 定时器引发的思考 定时器真的是定时执行吗...在主线程执行的,js是单线程的 定时器是如何实现的? ​...事件循环模型 启动定时器 document.getElementById...1000000; i++) { // 通过长时间循环延长定时器执行 } } JS是单线程的 1、如何证明js执行是单线程的?

    1.4K30

    requestAnimationFrame,终结定时器动画时代!

    } } setInterval(function () { render(); }, 1000/60); 复制代码 以上写法便可以实现循环往复的变大变小的操作...这种方法,可行吗?当然可行,完美吗?也还算完美,当突然发现新大陆以后,定时器便彻底被终结了,就比如,你用了苹果的Retina屏幕以后,发现再也回不去了是一个道理,你说1080p的屏幕完美吗?...然而由于定时器的在js中的执行方式,导致它有一些小小的瑕疵,虽然可以忍受,但是有更好的东西出来,为啥不淘汰掉他呢?...我们知道定时器的执行时间并不是确定的。这是由于js是个单线程的语言,他必须使用异步,来解决一些需要延时执行这个问题,那么为什么说定时器的执行时间不是确定的呢?...,在开始执行,走到这里,你会发现,在定时器执行的时候,前面还有会一堆同步代码也需要时间,如果前面有个循环个三五百次的话,会非常浪费时间,这就暴露出了定时器的一个缺点:丢帧现象,就是每次间隔其实是不确定的

    1.4K20
    领券