一道async/await、promise和setTimeout的面試題

題目:
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的),resolve(async2返回的promise返回的),setTimeout
八、而後執行resolve(new Promise的),輸出了promise2
九、接下來執行resolve(async2返回的promise返回的),輸出了async1 end
十、最後執行setTimeout,輸出了settimeout
chrome

相關文章
相關標籤/搜索