題目:
javascript
async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start')
setTimeout(function(){
console.log('setTimeout')
},0)
async1();
new Promise(function(resolve){
console.log('promise1')
resolve();
}).then(function(){
console.log('promise2')
})
console.log('script end')
複製代碼
答案(chrome輸出):
java
script start
async1 start
async2
promise1
script end
promise2
async1 end
settimeout
複製代碼
在解這個以前咱們有幾個知識點要清楚:
一、js
是單線程的。
二、promise
被定義後是當即執行的,可是他的resolve
是異步的。
三、promise
的異步優先級高於setTimeout
。
四、async
會返回一個promise
對象,await
關鍵字會讓出線程。
接下在咱們分析下代碼執行流程:
一、執行console.log('script start')
,輸出script start
;
二、執行setTimeout
,是一個異步動做,放入異步隊列中;
三、執行async1()
,輸出async1 start
,繼續向下執行;
四、執行async2()
,輸出async2
,並返回了一個promise對象,await讓出了線程,把返回的promise
加入了異步隊列,因此async1()
下面的代碼也要等待上面完成後繼續執行;
六、執行console.log('script end')
,輸出script end;
七、到此同步的代碼就都執行完成了,而後去異步隊列裏去獲取任務,如今隊列中有一個promise
(async2返回的),resolve
(new Promise的),和setTimeout
,先取出promise
執行,默認返回resolve
,再次加入了異步隊列,如今就隊列就變成了resolve
(new Promise的),resolv
e(async2返回的promise返回的),setTimeout
。
八、而後執行resolve
(new Promise的),輸出了promise2
。
九、接下來執行resolve
(async2返回的promise返回的),輸出了async1 end
。
十、最後執行setTimeout
,輸出了settimeout
。
chrome