js会优先执行主任务,微任务会入队到微任务队列,等主任务执行完毕后再执行微任务。
消息队列如setTimeout的优先级小于微任务小于主任务。
await 阻塞同一调用域的会一直阻塞,阻塞子函数调用域只阻塞一层。
如:await promise 和 await function{promise}的区别)
await promise后面要想执行必须得等promise所有.then执行完毕
await function{promise}后面的要想执行必须得等函数里面的promise的第一个.then执行完毕。
函数内部的await阻塞结束后,函数外的await 才会再次阻塞一次结束。如:await function{ await promise promise}会把里面的await执行完毕,如果第二个promise还有.then未执行完,则会再执行外面的await,也只阻塞一层.then。
await阻塞结束后是否执行下面的主任务取决于微任务队列是否清空,未清空,则会执行 准备执行的主任务 之前入队的微任务。执行完毕后,再执行主任务。并且执行主任务的顺序是由内而外。
(注意:子级阻塞结束是指一层.then执行完毕,同级阻塞结束是指整个.then执行完毕)
await 可以理解为等待同一调用域的微任务执行完毕后再调用同一作用域的主任务。那么像 await f{promise}这种要理解为在第一层.then执行完毕后,f这个函数在await眼里就执行完毕了(如果有多层.then,实际就肯定没有执行完毕,但是await会认为执行完毕)故而会执行下面的主任务。而像 await promise这种则是所有的 .then执行完毕后,await才会认为执行完毕,故而执行下面的主任务。
这个是对的,能解决大部分问题。虽然乱,但是不懂的时候一定要静下心来看看。