亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

js的settimeout方法 settimeout函數(shù)用法( 二 )


定時器線程前面異步例子的setTimeout其實就運行在這里,他跟JS主線程根本不在同一個地方,所以“單線程的JS”能夠?qū)崿F(xiàn)異步 。JS的定時器方法還有setInterval,也是在這個線程 。
事件觸發(fā)線程定時器線程其實只是一個計時的作用,他并不會真正執(zhí)行時間到了的回調(diào),真正執(zhí)行這個回調(diào)的還是JS主線程 。所以當時間到了定時器線程會將這個回調(diào)事件給到事件觸發(fā)線程,然后事件觸發(fā)線程將它加到事件隊列里面去 。最終JS主線程從事件隊列取出這個回調(diào)執(zhí)行 。事件觸發(fā)線程不僅會將定時器事件放入任務隊列,其他滿足條件的事件也是他負責放進任務隊列 。
異步HTTP請求線程這個線程負責處理異步的ajax請求,當請求完成后,他也會通知事件觸發(fā)線程,然后事件觸發(fā)線程將這個事件放入事件隊列給主線程執(zhí)行 。
所以JS異步的實現(xiàn)靠的就是瀏覽器的多線程,當他遇到異步API時,就將這個任務交給對應的線程,當這個異步API滿足回調(diào)條件時,對應的線程又通過事件觸發(fā)線程將這個事件放入任務隊列,然后主線程從任務隊列取出事件繼續(xù)執(zhí)行 。這個流程我們多次提到了任務隊列,這其實就是Event Loop,下面我們詳細來講解下 。
Event Loop所謂Event Loop,就是事件循環(huán),其實就是JS管理事件執(zhí)行的一個流程,具體的管理辦法由他具體的運行環(huán)境確定 。目前JS的主要運行環(huán)境有兩個,瀏覽器和Node.js 。這兩個環(huán)境的Event Loop還有點區(qū)別,我們會分開來講 。
瀏覽器的Event Loop事件循環(huán)就是一個循環(huán),是各個異步線程用來通訊和協(xié)同執(zhí)行的機制 。各個線程為了交換消息,還有一個公用的數(shù)據(jù)區(qū),這就是事件隊列 。各個異步線程執(zhí)行完后,通過事件觸發(fā)線程將回調(diào)事件放到事件隊列,主線程每次干完手上的活兒就來看看這個隊列有沒有新活兒,有的話就取出來執(zhí)行 。畫成一個流程圖就是這樣:
流程講解如下:
主線程每次執(zhí)行時,先看看要執(zhí)行的是同步任務,還是異步的API同步任務就繼續(xù)執(zhí)行,一直執(zhí)行完遇到異步API就將它交給對應的異步線程,自己繼續(xù)執(zhí)行同步任務異步線程執(zhí)行異步API,執(zhí)行完后,將異步回調(diào)事件放入事件隊列上主線程手上的同步任務干完后就來事件隊列看看有沒有任務主線程發(fā)現(xiàn)事件隊列有任務,就取出里面的任務執(zhí)行主線程不斷循環(huán)上述流程
定時器不準Event Loop的這個流程里面其實還是隱藏了一些坑的,最典型的問題就是總是先執(zhí)行同步任務,然后再執(zhí)行事件隊列里面的回調(diào) 。這個特性就直接影響了定時器的執(zhí)行,我們想想我們開始那個2秒定時器的執(zhí)行流程:
主線程執(zhí)行同步代碼遇到setTimeout,將它交給定時器線程定時器線程開始計時,2秒到了通知事件觸發(fā)線程事件觸發(fā)線程將定時器回調(diào)放入事件隊列,異步流程到此結(jié)束主線程如果有空,將定時器回調(diào)拿出來執(zhí)行,如果沒空這個回調(diào)就一直放在隊列里 。
上述流程我們可以看出,如果主線程長時間被阻塞,定時器回調(diào)就沒機會執(zhí)行,即使執(zhí)行了,那時間也不準了,我們將開頭那兩個例子結(jié)合起來就可以看出這個效果:
const syncFunc = (startTime) => {const time = new Date().getTime();while(true) {if(new Date().getTime() - time > 5000) {break;}}const offset = new Date().getTime() - startTime;console.log(`syncFunc run, time offset: ${offset}`);}const asyncFunc = (startTime) => {setTimeout(() => {const offset = new Date().getTime() - startTime;console.log(`asyncFunc run, time offset: ${offset}`);}, 2000);}const startTime = new Date().getTime();asyncFunc(startTime);syncFunc(startTime);執(zhí)行結(jié)果如下:


以上關于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: