js事件循环实例解析

js执行顺序分析

console.log(1)

setTimeout(()=>{
    console.log(2)
},2000)

setTimeout(()=>{
    console.log(3)
    Promise.resolve().then(()=>{
        console.log(4)
    })
    setTimeout(()=>{
        console.log(5)
    },3000)
},1000)

new Promise((resolve,reject)=>{
    console.log(6)
    resolve()
}).then(()=>{
    console.log(7)
})

console.log(8)

// 输出结果:1,6,8,7,3,4,2,5

同步任务
  • js单线程,解释执行

异步任务

MacroTask(Task): 宏任务。
  • 整体代码的script、setTimeout、setInterval、setImmediate、requestAnimationFrame、I/O、UI rendering;
MicroTask:微任务。
  • process.nextTick(Node环境中),Promise,Object.observe(基本废弃)

解析:

第一步:执行同步任务,并挂起异步任务
  • js为单线程,解释性语言,因此从头至尾逐行执行,遇到异步任务挂起至异步线程
  • 因此 首先依次输出 1 6 8
  • 注意:Promise中.then和.catch属于微任务,本身的回调函数属于同步任务,在主线程中直接执行
第二步:执行异步任务队列中的第一个宏任务
  • 异步任务挂起至异步线程中
  • 异步任务执行结束,拿到结果之后,将在异步队列中注册回调函数
  • 异步队列中的任务,优先执行宏任务,遇到微任务挂起至微任务栈中,待当前宏任务执行完毕后,执行完微任务栈中的所有微任务,
  • 然后执行宏任务队列中的第二个宏任务,重复上一步
  • 因此 此过程依次输出: 7
第三步:关于setTimeout
  • 一次性定时器,因为有延时,因此放在宏任务的最后执行
  • 一秒延时的定时器早于两秒延时的定时器的执行
  • 因此 此过程输出 3 4
  • 一秒定时器内部的三秒定时器,总延时长长于两秒
  • 因此 优先执行两秒定时器结果,之后执行一秒定时器的子定时器(三秒定时器)
  • 此过程输出 2 5

注意:宏任务中js执行顺序,和同步任务中js执行原理一致
注意:promise 是在当前脚本代码执行完后,立刻执行的,它并没有参与事件循环,所以它的优先级是高于 setTimeout
宏任务本质:参与了事件循环的任务
微任务本质:直接在 Javascript 引擎中的执行的,没有参与事件循环的任务

原文地址:https://www.cnblogs.com/nanhuaqiushui/p/11787480.html

时间: 2024-08-03 14:38:55

js事件循环实例解析的相关文章

js事件循环机制辨析

?对于新接触js语言的人来说,最令人困惑的大概就是事件循环机制了.最开始这也困惑了我好久,花了我几个月时间通过书本,打代码,查阅资料不停地渐进地理解他.接下来我想要和大家分享一下,虽然可能有些许错误的地方,希望大家不吝赐教,感谢感谢. ?这是所涉及的知识点: 观察者模式 js的事件循环机制 js事件循环机制优缺点及与多线程的比较 观察者模式 ?js的事件循环机制是基于观察者模式的,而跟观察者模式相对应的是轮询,我们先来说说轮询的原理. ?我们将轮询映射在现实世界中即为:B不停到A的房间观察房间里

node.js事件循环 event loop

Nodejs事件循环 (event loop) node.js 事件循环的概念 当node.js 启动的时候会初始化eventloop ,每一个evnet loop 都会包含如下6个循环阶段,node.js 事件循环和浏览器事件循环完全不一样. 官网文档:https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick/ timers pending callbacks (I/O callbakcs) idle, prepar

js事件循环

javascript是单线程 JavaScript的单线程,因为作为浏览器脚本语言,JavaScript的主要用途是增强用户与 Web 站点和 Web 应用程序之间的交互.这决定了它只能是单线程,否则会带来很复杂的并发问题.但是为了提高网页性能,往往js中都存在着大量的异步操作以解决js同步操作时可能会出现的浏览器的阻塞现象. 异步的必要性  单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.如果前一个任务耗时很长,后一个任务就不得不一直等着.这时对CPU的性能消耗就比较大,

Node.js 事件循环

原文:https://github.com/nodejs/node/blob/master/doc/topics/event-loop-timers-and-nexttick.md 什么是事件循环(Event Loop) 事件循环能让 Node.js 执行非阻塞 I/O 操作 -- 尽管JavaScript事实上是单线程的 -- 通过在可能的情况下把操作交给操作系统内核来实现. 由于大多数现代系统内核是多线程的,内核可以处理后台执行的多个操作.当其中一个操作完成的时候,内核告诉 Node.js,

03 js事件循环

1. js里重要的是事件循环. 参考:https://nodejs.org/en/docs/guides/ 中文版:https://github.com/nodejs/nodejs.org/tree/master/locale/zh-cn/docs/guides 写的好的:https://segmentfault.com/a/1190000013861128 好吧,班门弄斧,我简单介绍下,node事件循环,就是不停地去清空任务队列,这里有 微任务,宏任务之分. 微任务: process.next

js for循环实例

1.求1-100的寄数和? //2.奇数求和 var ppt=0 for(var i=1;i<=100;i+=2){ ppt+=i } 2.求1-100的偶数和 var num=0 for(var i=0;i<=100;i+=2){ //i+=2 意思为i=i+2 num +=i // } document.write("偶数和:"+num+"<br/>") 3.总和 var num1=0 for(var i=0;i<=100;i+=1

nodejs 事件循环

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

nodejs基础 -- 事件循环

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

深入理解 JavaScript 事件循环(一)— event loop

引言 相信所有学过 JavaScript 都知道它是一门单线程的语言,这也就意味着 JS 无法进行多线程编程,但是 JS 当中却有着无处不在的异步概念 .在初期许多人会把异步理解成类似多线程的编程模式,其实他们中有着很大的差别,要完全理解异步,就需要了解 JS 的运行核心——事件循环(event loop).在之前我对事件循环的认识也是一知半解的,直到我看了 Philip Roberts 的演讲 What the heck is the event loop anyway?,我才对事件循环有了一