# 同步和异步与宏任务和微任务

# Event Loop(事件轮询)

"Event Loop是一个程序结构,用于等待和发送消息和事件。(a programming construct that waits for and dispatches events or messages in a program.)"
1

简单说,就是在程序中设置两个线程:一个负责程序本身的运行,称为"主线程";另一个负责主线程与其他进程(主要是各种I/O操作)的通信,被称为"Event Loop线程"(可以译为"消息线程")。

# 同步和异步

什么是同步,什么是异步?

  • 同步:程序执行过程中,上一个任务结束立即执行下一个任务,执行的顺序和代码的顺序一致。

  • 异步:程序执行过程中,上一个任务执行结束立即执行回调函数,下一个任务不用等到上一个任务执行完成再执行,执行的顺序和代码书写的顺序有些差异。

console.log就是一个同步任务,

而常见的异步任务: Ajax,DOM事件操作,setTimeout,Promise的then方法,node读取文件

异步简介 (opens new window)

# 异步的三种实现方式

1)回调函数 
         回调函数不一定是异步 , 但异步一定有回调函数 
2)事件
3)Promise
1
2
3
4

需要注意的是⚠️:Promise构造函数是同步执行的(new Promise是同步的),而Promise是异步的(then,catch操作是异步的)

参考链接:

异步任务又分为宏任务和微任务

# 宏任务(task)和微任务(Microtasks)

宏任务和微任务都是异步任务,它们都属于一个队列,主要区别在于他们的执行顺序,Event Loop的走向和取值。

# 宏任务

# 浏览器 Node
I/O ✅ ✅
setTimeout ✅ ✅
setInterval ✅ ✅
setImmediate ❌ ✅
requestAnimationFrame ✅ ❌

# 微任务

# 浏览器 Node
process.nextTick ❌ ✅
MutationObserver ✅ ❌
Promise.then catch finally ✅ ✅

# js事件循环

Event Queue:

事件队列是一个存储库,在此存储来自应用程序的事件,然后再由接收程序或系统对其进行处理。 事件队列通常在企业消息传递系统的上下文中使用。

  • 同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数
  • 当指定的事情完成时,Event Table会将这个函数移入Event Queue。
  • 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
  • 上述过程会不断重复,也就是常说的Event Loop(事件循环)。

# js执行顺序

https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

同步 > 异步 > 微任务 > 宏任务

Promise构造函数是同步执行的,即new Promise() 是同步的,【也就是说new Promise()会立即执行】then函数本身也是同步的,不过then(callback) 里面的callback被放入了微任务队列,产生了异步执行