async是一種用同步的方式編寫異步代碼的方法,與promise一樣也是非阻塞的。
返回值:
async的返回值是一個promise對象。
執行順序:
async的異步指的是async函數后面的代碼是異步的,但async里面還是同步的,但需要注意的是,這里的同步不是說await后面的函數沒執行完就不往下執行(指async里面的await后面的代碼),而是,當調用async函數,程序執行到await時,1.會先去執行一遍await里面的代碼,2.再回到調用async函數后面繼續執行,3.完了之后再回到async里面的await后面繼續執行。前面說的執行一遍不是說全部執行完畢,await后面的函數里如果有一個定時器(5s),那么,程序並不會等待5s后再執行步驟1,而是執行定時器的時候,異步去執行步驟1后面的。
來看兩個例子:
1.如果await后面的函數的返回值是一個直接值,或者沒有返回值的普通函數。
<script> function sleep(sec) { console.log('執行1'); setTimeout(function () { console.log('執行2'); }, sec * 1000) } async function show() { console.log('start...'); let res = await sleep(5); console.log('執行3'); } show(); console.log('執行4'); console.log('執行5'); </script>
輸出結果:
//start...
//執行1
//執行4
//執行5
//執行3
//執行2
2.如果await后面返回的是一個promise對象。
function sleep(sec) { console.log('執行1'); return new Promise(function (resolve, reject) { setTimeout(function () { resolve('aaa');//如果不執行resolve,程序不會繼續往下執行 console.log('執行2'); }, sec * 1000) }) } async function show() { console.log('start...'); let res = await sleep(5); // console.log(res); console.log('執行3'); } show(); console.log('執行4'); console.log('執行5');
輸出結果:
//start...
//執行1
//執行4
//執行5
//執行2
//執行3
解釋:當程序執行到await時,會先去執行sleep里面代碼,輸出“執行1”,並將返回的promise對象放入promise隊列中,再去執行show()后面的代碼,輸出“執行4”,"執行5",然后再回到async里等待await的返回值,再繼續await后面的代碼。