事件队列

Javascript是单线程,单线程就意味着所有任务需要排队。然后会将所有任务分成两类:同步任务和异步任务!同步任务:在主线程上执行的任务,只有前一个任务执行完成,才会执行后一个!异步任务:不进入主线程、而进入“任务队列”的任务,当主线程上的任务执行完,主线程才会去执行“任务队列”。

只有一个main thread主线程,主线程执行完call-stack执行栈的任务后去检查异步的任务队列,如果异步事件触发,则将其加到主线程的执行栈。

执行顺序

主线程 ——> promise.nextick ——> promise.then ——> async ——> setTimeout ——> setInterval ——> setImmediate ——> I/O ——>> UI rendering

宏任务: 整体代码script  setTimeout  setInterval setImmediate(浏览器仅IE10支持) I/O操作 UI渲染
微任务: promise.then(非new Promise()) process.nextTick(node中) MutationObserverpromise实例化是主线程执行
await 相当于 new Promise()
async 是多个异步操作的promise对象,相当于then
process.nextTick在当前同步任务最后,异步任务之前
setImmediate用来操作耗时任务
复制代码
async function async1() {await async2()console.log('async1 end')
}
async function async2() {console.log('async2 end')
}
async1()//transfer
new Promise((resolve, reject) => {console.log('async2 end')// Promise.resolve() 将代码插入微任务队列尾部// resolve 再次插入微任务队列尾部resolve(Promise.resolve())
}).then(() => {console.log('async1 end')
})
复制代码

图解执行

当javascript代码执行的时候会将不同的变量存于内存中的不同位置:堆(heap)和栈(stack)中来加以区分,heap中一般存储我们的变量,stack一般存储函数或者方法。stack叫做执行栈,我们的方法依次会在这里执行。执行栈事件先进后出,任务队列先进先出。web apis则是代表一些异步事件,而callback queue即事件队列。

实现异步

  1. 回调函数
  2. 事件监听
  3. 发布/订阅
  4. Promise 对象
  5. generrator

转载于:https://juejin.im/post/5c8b45eaf265da2dca38a9cf

Event Loop相关推荐

  1. 【转载】浏览器事件循环机制(event loop)

    首先,本文转自https://juejin.im/post/5afbc62151882542af04112d 当我看完菲利普·罗伯茨的 javascript event loop的演讲的时候,就对于事 ...

  2. 简单理解浏览器的event loop 和 JavaScript的同步异步

    为什么JavaScript是单线程的? JavaScript的主要用途是和用户进行交互以及对DOM的操作,为了避免复杂的同步问题(如果多线程,A线程对某DOM添加内容,B线程对它又进行了删除操作,这往 ...

  3. anaconda spyder使用协程报错解决:RuntimeError: This event loop is already running

    早上在anaconda的spyder中写协程代码时遇到了报错. 代码如下: import asyncioasync def coroutine():print("hey")awai ...

  4. 从Promise来看JavaScript中的Event Loop、Tasks和Microtasks

    原文 github.com/creeperyang- 主题 Promise 看到过下面这样一道题: (function test() {setTimeout(function() {console.l ...

  5. 跟着 Event loop 规范理解浏览器中的异步机制

    原文发自我的 GitHub blog,欢迎关注 前言 我们都知道 JavaScript 是一门单线程语言,这意味着同一事件只能执行一个任务,结束了才能去执行下一个.如果前面的任务没有执行完,后面的任务 ...

  6. JavaScipt 中的事件循环(event loop),以及微任务 和宏任务的概念

    说事件循环(event loop)之前先要搞清楚几个问题. 1. js为什么是单线程的? 试想一下,如果js不是单线程的,同时有两个方法作用dom,一个删除,一个修改,那么这时候浏览器该听谁的? 2. ...

  7. js异步等待完成后再进行下一步操作_彻底搞懂JS事件中的循环机制 Event Loop

    我们都知道JavaScript是单线程语言,就是因为单线程的特性,就不得不提js中的同步和异步 一.同步和异步 所谓单线程,无非就是同步队列和异步队列,js代码是自上向下执行的,在主线程中立即执行的就 ...

  8. JavaScript 运行机制详解:Event Loop

    转自: http://www.ruanyifeng.com/blog/2014/10/event-loop.html 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单 ...

  9. 笔试题——JavaScript事件循环机制(event loop、macrotask、microtask)

    今天做了一道笔试题觉得很有意义分享给大家,题目如下: setTimeout(()=>{console.log('A'); },0); var obj={func:function () {set ...

  10. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

    https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...

最新文章

  1. html Frame、Iframe、Frameset 的区别 详细出处参考:http://www.jb51.net/web/22785.html
  2. golang 遍历文件夹和文件
  3. SQL注入——SQLmap的进阶使用(十三)
  4. 厉害了,我的清华大学,各系横幅让网友看花眼,尤其是第3条
  5. python中多对多替换_Python对指定文件内容进行全局替换
  6. 三十一、K8s供应链安全2 - 镜像的检测及优化与yaml文件安全
  7. 2018暑假第五周总结(8.6-8.12)
  8. 把ipa包上传到AppStore
  9. 社交网络的数据挖掘与分析,什么是社交网络分析
  10. 数据存储的未来,磁带是赢家?!
  11. Geek生活--netHack
  12. 临时执法卡点的设置原理与选址分析
  13. 从ccps项目中学习bottle,sqlalchemy,jinja2
  14. 谷歌面试题之扔鸡蛋的问题(蓝桥杯摔手机的问题)
  15. 码蹄集 - MT2095 · 曲径折跃
  16. Citespace的英文文献数据导入
  17. 精品微信小程序校园第二课堂在线学习网+后台系统|前后分离VUE
  18. 内心宁静_宁静js的新功能2 16 0
  19. Linux下安装window xp虚拟机
  20. 为什么线性规划问题的最优解一定能在可行域顶点中找到?

热门文章

  1. 洛谷P2429 制杖题 [2017年6月计划 数论10]
  2. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]
  3. MATLAB【九】————ICP算法实现
  4. 浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
  5. IDEA常用和实用配置以及各种必要插件
  6. Unix下C程序内存泄漏检测工具Valgrind安装与使用
  7. Java中的ClassLoader和SPI机制
  8. Linux环境编程--waitpid与fork与execlp
  9. C#中如何得到机器的IP地址
  10. 【Go】Go基础(八):结构体和方法