從面試題了解事件迴圈機制:
第一道:
//請寫出輸出內容
async function async1()
async function async2()
console.log('script start');
settimeout(function() , 0)
async1();
new promise(function(resolve) ).then(function() );
console.log('script end');
第二道:
async function async1()
async function async2() ).then(function() );
}console.log('script start');
settimeout(function() , 0)
async1();
new promise(function(resolve) ).then(function() );
console.log('script end');
第三道:
async function async1() ,0)
}async function async2() ,0)
}console.log('script start');
settimeout(function() , 0)
async1();
new promise(function(resolve) ).then(function() );
console.log('script end');
第四道:
async function a1 ()
async function a2 ()
console.log('script start')
settimeout(() => , 0)
promise.resolve().then(() => )
a1()
let promise2 = new promise((resolve) => )
promise2.then((res) => )
})console.log('script end')
第五道:
settimeout(function(),0);
new promise(function(resolve,reject),0)
}).then(function()).then(function());
process.nexttick(function());
console.log(6);
如果能正確答出上面題的輸出內容,並能給予背後原理的解釋,那證明讀者對於js中事件迴圈機制了解得挺深入的哦~
想要了解js中的事件迴圈機制,咱們需要了解如下內容:
說明:1、js執行緒負責處理js**,當遇到一些非同步操作的時候,則將這些非同步事件移交給web apis處理,自己則繼續往下執行
2、web apis執行緒將接收到的事件按照一定的規則新增到任務佇列中,巨集事件新增到巨集任務佇列中,微事件新增到微任務佇列中
3、js執行緒處理完當前的所有任務以後(執行棧為空),它會先去微任務佇列中獲取事件,並將微任務佇列中按照先進先執行的順序一件件執行完畢,直到微任務隊列為空後,再去巨集任務佇列中取出乙個事件執行
(每次取完乙個巨集任務佇列中的事件執行完畢後,都先檢查微任務佇列)
4、然後不斷迴圈第三步。
源**:
async function async1()
async function async2()
其實,根據await關鍵字的作用,會將後面的內容包裝成promise,然後應該是如下模樣:
async function async1()).then(()=>)
}
如下為開頭面試題答案:
第一道:
script start
async1 start
async2
promise1
script end
async1 end
promise2
settimeout
第二道:
script start
async1 start
promise1
promise3
script end
promise2
async1 end
promise4
settimeout
第三道:
script start
async1 start
promise1
script end
promise2
settimeout3
settimeout2
settimeout1
第四道:
script start
a1 start
a2promise2
script end
promise1
a1 end
promise2.then
promise3
settimeout
第五道:
//輸出的是 2 6 5 1 3 4
//區別在於promise的構造中,沒有同步的resolve
,因此promise.then在當前的執行佇列中是不存在的,
只有promise從pending轉移到resolve,才會有then方法,而這個resolve是在乙個settimout時間中完成的,因此3,4最後輸出。
巨人肩膀:
談談event loop中的job queue
事件迴圈(event loop)以及非同步執行順序
js事件迴圈機制
1 所有同步任務都在主線程上執行,形成乙個執行棧 execution context stack 2 主線程之外,還存在乙個 任務佇列 task queue 只要非同步任務有了執行結果,就在 任務佇列 之中放置乙個事件。3 一旦 執行棧 中的所有同步任務執行完畢,系統就會讀取 任務佇列 看看裡面有哪...
JS 事件迴圈機制(Event Loop)
js事件迴圈機制,最常用到的地方應該是做面試題,經常給出一段 讓你寫出console.log 順序,很傷腦經,死記題目過不久又忘了。了解js事件迴圈機制之後,可以很輕鬆的解決這類題目。js是單執行緒模式,但是又經常聽到 非同步 多執行緒 的概念,js中的 非同步 多執行緒 由事件迴圈機制現的 事件迴...
js 事件迴圈機制 EventLoop
js 的非阻塞i o 就是由事件迴圈機制實現的 眾所周知 js是單執行緒的 也就是上乙個任務完成後才能開始新的任務 那js碰到ajxa和定時器 promise這些非同步任務怎麼辦那?這時候就出現了事件佇列。js的主要執行棧 稱為主棧 用ajax舉例 執行的時候如果遇到ajax怎麼辦,ajax事件的實...