1. 程式人生 > 實用技巧 >async await promise setTimeOut

async await promise setTimeOut

今天看了一道經典前端題,看完之後感覺頗有收穫,願與君共勉;
先上題
`
async function foo(){
console.log('f00');
}
async function bar(){
console.log('bar start');
await foo();
console.log('bar end')
}
console.log('script start');
setTimeout(function(){
console.log('settimeout');
},0);

	  bar();
	  new Promise(function(resolve){
		  console.log('promise executor');
		  resolve();
	  }).then(function(){
		  console.log('promise then')
	  })
	  console.log('script end');

`
首先,我們來聊一下javascript的執行原理;
JavaScript是一個單執行緒的,程式執行自上而下,且遵循事件迴圈機制(event Loop),程式執行時分為同步任務和非同步任務,同步任務就是事情一件一件幹,一個執行任務完成再執行下一個,這就需要等待時間,而非同步就是將執行任務放入執行佇列中,當前一個結束,再到執行佇列中找下一個執行任務,這樣迴圈往復,就形成了event Loop。簡單來說。同步就是你在買奶茶時前面一個人拿到奶茶,你才能買,而非同步就是你已經付過錢了,先到一旁等待制作奶茶完成,商家繼續下一個買家買票。
然後我們來聊下這幾種非同步方式。
1,promise
promise的狀態有三種分別是pending(初始化),fulfilled(已完成),rejected(已失敗);狀態改變也只有兩種可能
pending到fulfilled:執行成功後執行resolved函式,既.then後的函式;
pending到rejected:執行成功後執行rejected函式,既.catch後的函式;
promise的狀態一旦改變便不再發生變化,then和catch可多次呼叫,then執行結束後下一個then接到的引數是上一個then return的值;
2,async和await
async/await是非同步執行的新方式,它是基於promise實現的,且await只能寫在async裡面,async會返回promise的物件,成功時resolve的return的值,失敗時reject的return的值,而await是讓出執行緒的一個標誌,當遇到await時則跳出整個async函式先執行async函式之外的函式,執行完成後再跳回async函式。
3,setTimeout
任務執行時又分為微任務和巨集任務,
微任務:promise,process.$nextick
巨集任務:setTimeout,setInterval,script
而微任務的優先順序要高於巨集任務
基於以上,我們來看這道題,它的結果就是程式自上而下先執行,遇到await跳出async執行,再執行promise然後最後執行settimeout,結果就是