事件循环(Event Loop)

1.什么是事件循环?

JavaScript为单线程执行的,所以是从上到下依次执行,js分为两个任务,宏任务和微任务

首先执行宏任务(第一次就是执行所有的同步代码),再执行所有的微任务,执行完毕之后再次执行

宏任务,执行完毕再次执行所有的微任务,也就是:

宏任务 --> 微任务  -->  宏任务 -->  微任务

2.什么是宏任务,微任务?

宏任务:

script(全局任务), setTimeout, setInterval, setImmediate, I/O, UI rendering.

微任务:

process.nextTick, Promise.then, Object.observer, MutationObserver.

3.案例深入解读

 setTimeout(function(){
    console.log(1)
 },0)

 new Promise((resolve,reject)=>{
     console.log(2)
     resolve(3)
     setTimeout(function(){
        console.log(5)
        promise.resolve
     },0)
 }).then((val)=>{
     console.log(val) })
 console.log(4)

解读:

首先执行宏任务(同步代码)  :console.log(2)  console.log(4)

再执行所有的微任务  console.log(3)

再一次从上到下执行所有的微任务:console.log(1)   console.log(5)

所以正确答案是  2 4  3 1 5

我们再加大难度

console.log(‘start‘)
setTimeout(() => {
  console.log(‘setTimeout 1‘)
  Promise.resolve().then(() => {
    console.log(‘promise 3‘)
  }).then(() => {
    console.log(‘promise 4‘)
  }).then(() => {
    setTimeout(() => {
      console.log(‘setTimeout 2‘)
      Promise.resolve().then(() => {
        console.log(‘promise 5‘)
      }).then(() => {
        console.log(‘promise 6‘)
      })
    }, 0)
  })
}, 0)
Promise.resolve().then(() => {
  console.log(‘promise 1‘)
}).then(() => {
  console.log(‘promise 2‘)
})

解读:

我们先执行同步代码: start

微任务:promise 1 ,  promise 2

宏任务: setTimeout 1

微任务:promise 3, promise 4

宏任务:setTimeout 2 ,

微任务:promise 5,promise 6

正确答案

start promise 1 promise 2 setTimeout 1 promise 3 promise 4 setTimeout 2 promise 5 promise 6

原文地址:https://www.cnblogs.com/guan-shan/p/10127853.html

时间: 2024-11-04 19:03:47

事件循环(Event Loop)的相关文章

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

JavaScript:彻底理解同步、异步和事件循环(Event Loop) (转)

原文出处:https://segmentfault.com/a/1190000004322358 一. 单线程 我们常说"JavaScript是单线程的". 所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个.不妨叫它主线程. 但是实际上还存在其他的线程.例如:处理AJAX请求的线程.处理DOM事件的线程.定时器线程.读写文件的线程(例如在Node.js中)等等.这些线程可能存在于JS引擎之内,也可能存在于JS引擎之外,在此我们不做区分.不妨叫它们工作线程

JavaScript:彻底理解同步、异步和事件循环(Event Loop)

转自:https://segmentfault.com/a/1190000004322358 http://www.cnblogs.com/rubylouvre/ http://www.tuicool.com/articles/7B7Bju http://soyoung.blog.51cto.com/7578959/1550874/ http://bbs.csdn.net/topics/390765530 https://cnodejs.org/topic/52414b3a101e5745219

同步异步和Event loop事件循环

目录 js 单线程模型 js 中的栈.堆和消息队列 栈 堆 消息队列 Event Loop 什么是事件循环Event Loop 主线程 同步任务和异步任务 同步任务 异步任务 宏任务 微任务 事件循环的过程 js 单线程模型 JavaScript 是单线程.非阻塞的一种语言,只有一个主线程,同时只能执行一个任务. js 使用单线程是为了简单化 js 中的栈.堆和消息队列 栈 存放的是调用函数的记录--调用帧 堆 存放的是对象 消息队列 包含待处理消息的队列 每个消息都关联了一个回调函数,用以处理

定时器运行原理 && javascript事件循环模型

定时器是我们经常使用的一个异步函数,它的用处十分广泛,比如图片轮播.各种小的动画.延时操作等等:定时器函数只有两个setTimeout.setInterval,这两个工作原理相同,唯一的区别是:setTimeout只执行一次,setInterval循环执行:通过以下实例看看对定时器原理掌握程度: 定时器3个实例 首先声明这三个实例输出皆不同,先思考输出结果,以及为何不同 实例一: console.log('test1') for(var i=0;i<10;i++){ setTimeout(()=

Qt事件循环与状态机事件循环的思考

写下这个给自己备忘,关于事件循环以及多线程方面的东西我还需要多多学习.首先我们都知道程序有一个主线程,在GUI程序中这个主线程也叫GUI线程,图形和绘图相关的函数都是由主线程来提供.主线程有个事件循环Event Loop,其实就是一个死循环在不断的等待你的消息队列,通过消息队列完成响应用户操作,绘图,以及相关操作.我们都知道QDialog有一个exec函数,这个函数会形成“模态”对话框,然后等待用户去输入OK还是Cancel,否则他绝不返回,如下 void test() { QDialog di

以setTimeout来聊聊Event Loop

平时的工作中,也许你会经常用到setTimeout这个方法,可是你真的了解setTimeout吗?本文想通过总结setTimeout的用法,顺便来探索javascript里面的事件执行机制. setTimeout基本用法 1. setTimeout(code,millisec) setTimeout函数接受两个参数,第一个参数code是将要推迟执行的函数名或者一段代码,第二个参数millisec是推迟执行的毫秒数. 例如: setTimeout(‘console.log(2)’,100); se

并发模型与Event Loop

JavaScript的并发模型基于"event loop".这个模型与其他在C或者Java中的模型着实不同. 运行时概念 下面的内容解释了一个理论上的模型.现代JavaScript引擎着重实现和优化了描述的几个语义. 可视化描述 栈 函数调用形成了一个frames的栈. function f(b){   var a = 12;   return a+b+35;}function g(x){   var m = 4;   return f(m*x);}g(21); 调用g的时候,创建了第

javascript的执行机制—Event Loop

既然今天要谈的是javascript的事件循环机制,要理解事件循环,首先要知道事件循环是什么. 我们先从一个例子来看一下javascript的执行顺序. <script> setTimeout(function() { console.log('定时器开始了.'); },0) new Promise(function(resolve) { console.log('马上执行for循环了'); for (let i = 0; i < 10000; i++) { i == 99 &&

总结:JavaScript异步、事件循环与消息队列、微任务与宏任务

本人正在努力学习前端,内容仅供参考.由于各种原因(不喜欢博客园的UI),大家可以移步我的github阅读体验更佳:传送门,喜欢就点个star咯,或者我的博客:https://blog.tangzhengwei.me 掘金:传送门,segmentfault:传送门 前言 Philip Roberts 在演讲 great talk at JSConf on the event loop 中说:要是用一句话来形容 JavaScript,我可能会这样: "JavaScript 是单线程.异步.非阻塞.解