1 async function async1() { 2 console.log('async1 start'); 3 await async2(); 4 console.log('asnyc1 end'); 5 } 6 async function async2() { 7 console.log('async2'); 8 } 9 console.log('script start'); 10 setTimeout(() => { 11 console.log('setTimeOut'); 12 }, 0); 13 async1(); 14 new Promise(function (reslove) { 15 console.log('promise1'); 16 reslove(); 17 }).then(function () { 18 console.log('promise2'); 19 }) 20 console.log('script end');
1 script start 2 async1 start 3 async2 4 promise1 5 script end 6 asnyc1 end 7 promise2 8 setTimeOut
事件的執行順序,是先執行宏任務,而後執行微任務,這個是基礎,任務能夠有同步任務和異步任務,同步的進入主線程,異步的進入Event Table並註冊函數,異步事件完成後,會將回調函數放入Event Queue中(宏任務和微任務是不一樣的Event Queue),同步任務執行完成後,會從Event Queue中讀取事件放入主線程執行,回調函數中可能還會包含不一樣的任務,所以會循環執行上述操做。
注意: setTimeOut並非直接的把你的回掉函數放進上述的異步隊列中去,而是在定時器的時間到了以後,把回掉函數放到執行異步隊列中去。若是此時這個隊列已經有不少任務了,那就排在他們的後面。這也就解釋了爲何setTimeOut爲何不能精準的執行的問題了。setTimeOut執行須要知足兩個條件:node
簡單理解就是:promise
瞭解了什麼是宏任務和微任務,就好理解多了,首先執行 宏任務 => 微任務的Event Queue => 宏任務的Event Queue異步
參考博客:https://blog.csdn.net/yun_hou/article/details/88697954async