- js是单线程,在同一时间只能做一件事情。
- 任务队列:同步队列和异步队列两种
- 同步任务(依次执行)和异步任务(先挂起,同步任务完毕处理异步任务)
- 异步任务的放入时间和执行时间
- 事件循环event loop
- 执行栈执行的是同步任务,并在这一过程中放入微任务和宏任务
- 同步任务执行完之后,检查微任务并放入主线程任务栈中执行
- 取出宏任务队列中的任务,放入执行栈中执行,开始下一轮的事件循环
- 异步任务触发
- setTimeout和setInterval
- DOM事件:用addeventlistener注册一个事件,浏览器会有一个单独的模块去接收,事件触发的时候,浏览器的模块就开始把注册的函数体放到异步队列中
- ES6中的promise
- await和事件循环的关系
- 遇到await关键字,await右边的语句会被立即执行然后await下面的代码进入等待状态,等待await得到结果。
- await后面如果不是 promise 对象, await会阻塞后面的代码,先执行async外面的同步代码,同步代码执行完,再回到async内部,把这个非promise的东西,作为 await表达式的结果。
- await后面如果是 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。