任務隊列挫酿、異步、函數(shù)節(jié)流

瀏覽器的單線程模型

在瀏覽器中愕难,JS 的代碼執(zhí)行是單線程模式早龟。就是只有一個線程去處理 JS 代碼,一旦當前隊列中有任務在執(zhí)行猫缭,后續(xù)的任務都會等到當前任務執(zhí)行完畢才會執(zhí)行葱弟。

為什么是單線程?因為瀏覽器在很早就發(fā)明出來了猜丹,當時考慮的主要就是簡單芝加。單線程相較于多線程模式會簡單很多,所以 JS 的執(zhí)行就一直都是一種單線程模式射窒。

這種模式的好處就是實現(xiàn)起來比較簡單藏杖,不用考慮多線程的執(zhí)行順序之類的問題;缺點就是只要有一個任務耗時很長脉顿,后面的任務都會排隊等待蝌麸,會拖延整個程序的執(zhí)行。

在早期的 IE 瀏覽器中弊予,如果有一個 ajax 請求在等待數(shù)據(jù)返回的時候祥楣,頁面經(jīng)常性的卡死無法操作,甚至都不能滾動頁面汉柒。

異步

異步任務隊列模型

在正常情況下误褪,所有的任務都是放在棧中按順序執(zhí)行。但是如果碰到耗時比較久的任務呢碾褂?兽间?

實際上,在瀏覽器中正塌,還有一個任務隊列(callback queue)嘀略。這里存放的都是異步執(zhí)行的任務恤溶。

例如此時我們給某一元素綁定了一個 onClick 事件。綁定的事件我們可以放到主線程中去進行綁定帜羊,但是事件的觸發(fā)我們放到了任務隊列中咒程。只有在主線程中的任務都執(zhí)行完畢后才會執(zhí)行任務隊里列里的任務。

setTimeout 和 setInterval 的操作方式時將綁定的事件移除出本次的事件循環(huán)(event loop)讼育,等到下一次事件循環(huán)的時候去檢查是否到了指定時間帐姻。如果到了,就執(zhí)行對應的代碼奶段;如果沒到饥瓷,就等到下一輪的事件循環(huán)(event loop)時再去判斷。

函數(shù)節(jié)流

為了性能的考慮痹籍,有時候有一些頻發(fā)觸發(fā)的事件我們需要做一些相對應的節(jié)流方式呢铆。例如頁面滾動的時候,每滾一次就會觸發(fā)一次蹲缠,感覺有些浪費性能棺克。

我們可以利用 setTimeout 和 clearTimeout 來進行函數(shù)節(jié)流。

var timer;
function always(){
    if(timer) clearTimeout(timer);
    timer = setTimeout(function() {
        console.log('Timer...');
    }, 2000);
}

當函數(shù)調(diào)用時吼砂,會進行一個判斷:如果當前的值為 false 逆航,那么就給它設置一個 setTimeout 鼎文;如果在 setTimeout 的時限之內(nèi)再次調(diào)用的話渔肩,就會清除當前的 setTimeout ,并且在重新設置一個 setTimeout 拇惋。只有在時限內(nèi)無動作的話周偎,函數(shù)才會直接結果。

這樣就實現(xiàn)了函數(shù)的節(jié)流撑帖,減少了后續(xù)代碼的等待蓉坎。如果 setTimeout 里面是一個 ajax 請求的話,這個效果會更明顯的胡嘿。節(jié)省了請求的時間蛉艾,也提高了頁面的性能。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衷敌,一起剝皮案震驚了整個濱河市勿侯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缴罗,老刑警劉巖助琐,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異面氓,居然都是意外死亡兵钮,警方通過查閱死者的電腦和手機蛆橡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掘譬,“玉大人泰演,你說我怎么就攤上這事〈行” “怎么了粥血?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酿箭。 經(jīng)常有香客問我复亏,道長,這世上最難降的妖魔是什么缭嫡? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任缔御,我火速辦了婚禮,結果婚禮上妇蛀,老公的妹妹穿的比我還像新娘耕突。我一直安慰自己,他們只是感情好评架,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布眷茁。 她就那樣靜靜地躺著,像睡著了一般纵诞。 火紅的嫁衣襯著肌膚如雪上祈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天浙芙,我揣著相機與錄音登刺,去河邊找鬼。 笑死嗡呼,一個胖子當著我的面吹牛纸俭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播南窗,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼揍很,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了万伤?” 一聲冷哼從身側(cè)響起窒悔,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壕翩,沒想到半個月后蛉迹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡放妈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年北救,在試婚紗的時候發(fā)現(xiàn)自己被綠了荐操。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡珍策,死狀恐怖托启,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攘宙,我是刑警寧澤屯耸,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蹭劈,受9級特大地震影響疗绣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铺韧,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一多矮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哈打,春花似錦塔逃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至立轧,卻和暖如春格粪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肺孵。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工匀借, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人平窘。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像凳怨,于是被迫代替她去往敵國和親瑰艘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容