# js中的任务类型 1. 宏任务 1. settimeout 2. setInterval 3. MessageChannel 4. I/O,事件队列 5. setImmediate 6. script 2. 微任务 1. requestAnimationFrame 2. MutationObserver 3. Promise.[then/catch/finally] 4. process.nexTick 5. queueMicrotask # js中异步任务执行规则 1. 先顺序执行下去,有遇到异步任务将其放置一边,然后继续执行下面的任务,执行完同步任务后再去看异步任务中的微任务是否有执行完了的,如果有则执行,执行完后则去执行宏任务,以此来完成一次循环 # js中async 和await的细节 ### 1. await 1. 在js中 await 需要在async函数内进行执行, 遇到await时会等同于 promise 任务,将会在宏任务执行时立即执行,但是在await阻塞后的任务将会被当作是微任务去进行, ``` async function fn(){ await fn2(); ...dostm } // 等同于 function fn(){ fn2().then(()=>{ ...dostm }) } ``` ### 2. async 1. 在js中的 async 相当于一个 promise 任务, # js中promise和setTimeout谁先执行 1. 在js中的promise视为微任务,settimeout为宏任务 根据执行规则微任务先执行,所以promise会先执行 2. 示例代码 ``` console.log(1); //1 new Promise((resolve, reject) => { console.log(2); //2 resolve(); }).then(() => { console.log(3) //4 }); setTimeout(() => { console.log(4) //6 }); setTimeout(() => { console.log(5) //7 }); new Promise((resolve, reject) => { console.log(6); //3 resolve(); }).then(() => { console.log(7); //5 }); new Promise((resolve, reject) => { console.log(8); setTimeout(() => { console.log(9) resolve(); }); }).then(() => { console.log(10); }); // 1 2 6 8 3 7 4 5 9 10 ```