js是单线程语言,实现多线程和异步需要eventloop实现,在一次事件循环中,js会先执行同步代码,即主任务,然后去查找是否有微任务主要是promise的回调函数,如果有就优先执行微任务,然后去查找宏任务(setTimeout)进行执行。
注意:
- promise实例new Promise是同步操作,promise的回调函数.then()是异步操作
- 在函数名前加上async关键字,表示这个函数内部有异步操作但是和普通函数的区别知识返回的是promise对象 return 一个promise.resolve();
- 当遇到await时,会阻塞函数内部处于它后面的代码,把后面的代码放到微任务队列中,去执行该函数外部的同步代码,当外部同步代码执行完之后,会回到该函数内部执行剩余的代码,当await执行完毕之后,处理微任务队列的代码,清空微任务队列的代码会按照先后顺序比如 a任务,b任务,清空顺序也为a任务,b任务。
例题1
结果
- script start
- async1 start
- async2
- promise1
- promise2
- script end
- nextTick
- async1 end
- promise3
- setTimeout0
- setImmediate
- setTimeout3
例题2
结果
- 2222
- 5555
- 11111
- 33333
- 6666
- 7777
- 44444