成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

瀏覽器端Event loop簡介

alexnevsky / 1426人閱讀

摘要:所以提出了標準,允許創(chuàng)建子線程,但是規(guī)定很嚴格,子線程要受到主線程控制,并且不能操作,這種折中方法使得更加靈活了。案例輸出的結(jié)果為案例這個的執(zhí)行結(jié)果都是一樣的,都會先執(zhí)行事件,因為要等主線程空了才會去查看子線程有沒有回調(diào)內(nèi)容。

了解過javascript的都知道其最大的特點就是單線程,也就是說同一時間只能干一件事情。那么為什么不能是多線程呢?原因很簡單,多線程太復雜了,假設javascript有2個線程,一個去添加dom,一個去刪除dom,那么瀏覽器就懵逼了,這到底要我選擇哪個?所以為了避免不必要的麻煩,javascript一開始就選擇了單線程。但是單線程也有問題,假設有個任務是要向服務器去請求一個文件,如果這個文件很大,那么就不能立即執(zhí)行下一語句(要等到文件回來),這樣就造成了瀏覽器假死的現(xiàn)象。所以html5提出了web worker標準,允許javascript創(chuàng)建子線程,但是規(guī)定很嚴格,子線程要受到主線程控制,并且不能操作dom,這種折中方法使得javascript更加靈活了。

到目前為止javascript可以有子線程了,這時候再遇到像之前提到的如果一個io操作很費時間,那么就可以把這個任務掛起來,等返回結(jié)果了再來執(zhí)行這個任務。于是所有的任務都變成了2種,一種是同步任務(從上到下一步一步執(zhí)行),另外一種就是異步任務(等有結(jié)果了再執(zhí)行,即所謂的消息隊列)。這2種任務進入到線程也不一樣,同步的從上到下依次直接進入主線程形成執(zhí)行棧,異步的等有返回結(jié)果了,比如ajax請求成功了,就把成功的回調(diào)放到子線程里面去(失敗就把失敗的回調(diào)放到子線程里面去)。現(xiàn)在瀏覽器開始執(zhí)行主線程里面的執(zhí)行棧了,等主線程里面的執(zhí)行棧都執(zhí)行完畢了,主線程就會到子線程里面去看之前掛起到任務哪些有回調(diào)了,如果有回調(diào)了,那就把該回調(diào)內(nèi)容放到主線程里面去執(zhí)行,等執(zhí)行完畢了再去子線程看有沒有新的回調(diào)了(這里要注意的是主線程全部執(zhí)行完畢,才會去子線程去看),主線程不斷的重復這個步驟,這就是所謂的Event loop,也就是javascript的運行機制。比較特殊的是setTimeout,setinterval這2個方法,它們也會被放倒子線程里面去,比如我使用setTimeout(fn,3000),有時候不一定是3s之后會執(zhí)行fn這個事件,還要看主線程里面的任務是否完成。

案例1:

function f() {
  console.log("foo");
  setTimeout(g, 0);
  console.log("baz");
  h();
}

function g() {
  console.log("bar");
}

function h() {
  console.log("blix");
}

f();
輸出的結(jié)果為:foo 、baz 、 blix 、bar

案例2 :

var req = new XMLHttpRequest();
req.open("GET", url);    
req.onload = function (){};    
req.onerror = function (){};    
req.send();
var req = new XMLHttpRequest();
req.open("GET", url);
req.send();
req.onload = function (){};    
req.onerror = function (){};   

這2個的執(zhí)行結(jié)果都是一樣的,都會先執(zhí)行onload事件,因為javascript要等主線程空了才會去查看子線程有沒有回調(diào)內(nèi)容。

注意點:

異步的任務執(zhí)行的順序是不固定的,主要看返回的速度,假設a任務寫在b任務之前,但是a任務比較大,耗時比較長,而b任務耗時短,那么b任務有了回調(diào)先會進入到子線程里面,這樣會被主線程先輪詢到,但是也有可能b任務網(wǎng)絡不好,a任務先返回了,那么a任務的回調(diào)先被注冊到子線程了,導致a先執(zhí)行了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82277.html

相關(guān)文章

  • 覽器與Node的事件循環(huán)(Event Loop)有何區(qū)別?

    摘要:事件觸發(fā)線程主要負責將準備好的事件交給引擎線程執(zhí)行。它將不同的任務分配給不同的線程,形成一個事件循環(huán),以異步的方式將任務的執(zhí)行結(jié)果返回給引擎。 Fundebug經(jīng)作者浪里行舟授權(quán)首發(fā),未經(jīng)同意請勿轉(zhuǎn)載。 前言 本文我們將會介紹 JS 實現(xiàn)異步的原理,并且了解了在瀏覽器和 Node 中 Event Loop 其實是不相同的。 一、線程與進程 1. 概念 我們經(jīng)常說 JS 是單線程執(zhí)行的,...

    TANKING 評論0 收藏0
  • Python 的異步 IO:Asyncio 簡介

    摘要:是并發(fā)的一種方式。并不能帶來真正的并行。可交給執(zhí)行的任務,稱為協(xié)程。輸出等待三秒鐘程序退出現(xiàn)在改用輸出等待三秒鐘程序沒有退出三秒鐘過后,結(jié)束,但是程序并不會退出。但是如果關(guān)閉了,就不能再運行了此處異常建議調(diào)用,以徹底清理對象防止誤用。 所謂「異步 IO」,就是你發(fā)起一個 IO 操作,卻不用等它結(jié)束,你可以繼續(xù)做其他事情,當它結(jié)束時,你會得到通知。 Asyncio 是并發(fā)(concurr...

    ky0ncheng 評論0 收藏0
  • 2018你成長了么?一份給你的前技術(shù)清單

    摘要:由于個人精力有限,一些技術(shù)點的歸納可能有失偏頗,或者目前并未納入進來,因此上的清單內(nèi)容也會不斷更新。 2018 眼看就要過去了,今年的你相較去年技術(shù)上有怎樣的收獲呢? 記得年初的時候我給自己制定了一個學習計劃,現(xiàn)在回顧來看完成度還不錯。但仍有些遺憾,一些技術(shù)點沒有時間去好好學習。 在學習中我發(fā)現(xiàn),像文章這樣的知識往往是碎片化的,而前端涉及到的面很多,如果不將這些知識有效梳理,則無法形成...

    K_B_Z 評論0 收藏0
  • 2018你成長了么?一份給你的前技術(shù)清單

    摘要:由于個人精力有限,一些技術(shù)點的歸納可能有失偏頗,或者目前并未納入進來,因此上的清單內(nèi)容也會不斷更新。 2018 眼看就要過去了,今年的你相較去年技術(shù)上有怎樣的收獲呢? 記得年初的時候我給自己制定了一個學習計劃,現(xiàn)在回顧來看完成度還不錯。但仍有些遺憾,一些技術(shù)點沒有時間去好好學習。 在學習中我發(fā)現(xiàn),像文章這樣的知識往往是碎片化的,而前端涉及到的面很多,如果不將這些知識有效梳理,則無法形成...

    LancerComet 評論0 收藏0
  • 2018你成長了么?一份給你的前技術(shù)清單

    摘要:由于個人精力有限,一些技術(shù)點的歸納可能有失偏頗,或者目前并未納入進來,因此上的清單內(nèi)容也會不斷更新。 2018 眼看就要過去了,今年的你相較去年技術(shù)上有怎樣的收獲呢? 記得年初的時候我給自己制定了一個學習計劃,現(xiàn)在回顧來看完成度還不錯。但仍有些遺憾,一些技術(shù)點沒有時間去好好學習。 在學習中我發(fā)現(xiàn),像文章這樣的知識往往是碎片化的,而前端涉及到的面很多,如果不將這些知識有效梳理,則無法形成...

    Flands 評論0 收藏0

發(fā)表評論

0條評論

alexnevsky

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<