JS同步異步以及回調(diào)函數(shù)?

js同步異步以及回調(diào)函數(shù)



1.背景介紹

什么是同步省核,什么是異步?

同步指的是一次只能完成一件任務(wù)稿辙。如果有多個(gè)任務(wù),就必須排隊(duì)气忠,前面一個(gè)任務(wù)完成邻储,再執(zhí)行后面一個(gè)任務(wù)赋咽,以此類推。

異步指的是每一個(gè)任務(wù)有一個(gè)或多個(gè)回調(diào)函數(shù)(callback)吨娜,前一個(gè)任務(wù)結(jié)束后脓匿,不是執(zhí)行后一個(gè)任務(wù),而是執(zhí)行回調(diào)函數(shù)萌壳,后一個(gè)任務(wù)則是不等前一個(gè)任務(wù)結(jié)束就執(zhí)行亦镶,所以程序的執(zhí)行順序與任務(wù)的排列順序是不一致的、異步的袱瓮。

2.知識(shí)剖析

javascript實(shí)現(xiàn)異步的原理

首先js是單線程的語言缤骨,即同一時(shí)間只能做做一件事。那Js如何實(shí)現(xiàn)異步的尺借,異步和單線程不是自相矛盾嗎绊起?其實(shí),單線程和異步確實(shí)不能同時(shí)成為一個(gè)語言的特性燎斩。js選擇了成為單線程的語言虱歪,所以它本身不可能是異步的,但js的宿主環(huán)境(比如瀏覽器栅表,Node)是多線程的笋鄙,宿主環(huán)境通過某種方式(事件驅(qū)動(dòng),下文會(huì)講)使得js具備了異步的屬性

瀏覽器的內(nèi)核是多線程的怪瓶,它們?cè)趦?nèi)核制控下相互配合以保持同步萧落,一個(gè)瀏覽器至少實(shí)現(xiàn)三個(gè)常駐線程:javascript引擎線程,UI渲染線程洗贰,瀏覽器事件觸發(fā)線程找岖。

javascript引擎線程是基于事件驅(qū)動(dòng)單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來敛滋,然后加以處理许布,瀏覽器無論什么時(shí)候都只有一個(gè)JS線程在運(yùn)行JS程序。

UI渲染線程負(fù)責(zé)渲染瀏覽器界面绎晃,當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時(shí),該線程就會(huì)執(zhí)行蜜唾。但需要注意UI渲染線程與JS引擎是互斥的,當(dāng)JS引擎執(zhí)行時(shí)UI線程會(huì)被掛起庶艾,UI更新會(huì)被保存在一個(gè)隊(duì)列中等到JS引擎空閑時(shí)立即被執(zhí)行.

事件觸發(fā)線程袁余,當(dāng)一個(gè)事件被觸發(fā)時(shí)該線程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾,等待JS引擎的處理落竹。這些事件可來自JavaScript引擎當(dāng)前執(zhí)行的代碼塊如setTimeOut、也可來自瀏覽器內(nèi)核的其他線程如鼠標(biāo)點(diǎn)擊货抄、AJAX異步請(qǐng)求等述召,但由于JS的單線程關(guān)系所有這些事件都得排隊(duì)等待JS引擎處理朱转。

image

UI線程和JS線程互斥的實(shí)例

分析:第一個(gè)在keydown的時(shí)候,彈出來的是input里原來的value积暖,而第2個(gè)在keydown的時(shí)候藤为,卻能彈出更新后的value,就是因?yàn)閟etTimeout夺刑,雖然他的delay設(shè)置為0缅疟,幾乎是即時(shí)觸發(fā),但還是被添加到了執(zhí)行隊(duì)列后面遍愿,但就是這個(gè)過程存淫,渲染已經(jīng)完成了,當(dāng)他回調(diào)函數(shù)執(zhí)行時(shí)沼填,輸出來的已經(jīng)是更新后的value了桅咆。

注意:js的工作機(jī)制是當(dāng)線程空閑的情況下才會(huì)執(zhí)行異步代碼的回調(diào)函數(shù)

即當(dāng)所有同步任務(wù)執(zhí)行完畢后才會(huì)執(zhí)行異步任務(wù)的回調(diào)函數(shù)

總結(jié):當(dāng)Js執(zhí)行到異步任務(wù)后,會(huì)將異步任務(wù)交給瀏覽器進(jìn)行執(zhí)行坞笙,當(dāng)執(zhí)行有結(jié)果時(shí)會(huì)把異步任務(wù)的回調(diào)函數(shù)插入待處理隊(duì)列的隊(duì)尾岩饼。

3.常見問題

ajax發(fā)送異步請(qǐng)求瀏覽器做了什么

有哪些常見異步回調(diào)函數(shù)?

4.解決方案

ajax發(fā)送異步請(qǐng)求瀏覽器做了什么薛夜?

Js創(chuàng)建了一個(gè)ajax請(qǐng)求

瀏覽器另外開啟一個(gè)ajax引擎線程籍茧,執(zhí)行ajax請(qǐng)求

執(zhí)行得到響應(yīng)后將回調(diào)函數(shù)放入任務(wù)隊(duì)列中。

Js執(zhí)行任務(wù)隊(duì)列中的回調(diào)函數(shù)梯澜。

有哪些常見的異步回調(diào)函數(shù)寞冯?

點(diǎn)擊事件

Ajax請(qǐng)求

定時(shí)器

瀏覽器處理點(diǎn)擊事件的過程

瀏覽器開啟事件觸發(fā)線程,等待用戶動(dòng)作腊徙,事件觸發(fā)線程解析為響應(yīng)事件简十,轉(zhuǎn)移到j(luò)avascript引擎線程,排隊(duì)等候撬腾,等待javascript引擎的處理螟蝙。

例:

click mefunctionclickme(){console.log('點(diǎn)擊事件')? ? }for(i=0;i<50000;i++){console.log(i)? ? }

在線實(shí)例

這個(gè)點(diǎn)擊事件會(huì)等到for循環(huán)執(zhí)行完畢后才會(huì)執(zhí)行,即我們點(diǎn)擊模塊它直到for循環(huán)執(zhí)行完畢才會(huì)執(zhí)行

5.編碼實(shí)戰(zhàn)


6.擴(kuò)展思考

如何實(shí)現(xiàn)js的多線程操作民傻?

Html5的web worker

7.更多討論

8.參考文獻(xiàn)

參考一:js的單線程和異步

參考二:深入理解javascript異步編程障眼法&&h5 web worker實(shí)現(xiàn)多線程

參考三:談?wù)凧avaScript的異步實(shí)現(xiàn)- 小方- 博客園

Q1:瀏覽器的UI線程和Js線程為什么是互斥的胰默?

A1:而因?yàn)镴S可以操作DOM元素,進(jìn)而會(huì)影響到GUI的渲染結(jié)果漓踢,因此JS引擎線程與GUI渲染線程是互斥的牵署。

Q2:異步函數(shù)有哪些優(yōu)點(diǎn)和缺點(diǎn)

A2:

優(yōu)點(diǎn):

a)對(duì)CPU的使用率高。

b)不用考慮線程間同步互斥問題喧半。

缺點(diǎn):

a)實(shí)現(xiàn)較復(fù)雜奴迅,要把所有會(huì)導(dǎo)致阻塞的操作轉(zhuǎn)化為異步操作。

b)并發(fā)性不好挺据,在有的事件需要長(zhǎng)時(shí)間占用CPU處理的情況下取具,其他事件會(huì)長(zhǎng)時(shí)間等待得不到處理脖隶。

c)在多CPU時(shí)不如多線程高效。

Q3:異步函數(shù)跟promise之間有什么關(guān)系暇检?

A3:Promise它可以用于異步的回調(diào)函數(shù)产阱,它跟傳統(tǒng)的回調(diào)函數(shù)相比,promise的異步回調(diào)函數(shù)代碼書寫起來更優(yōu)雅块仆,更便于閱讀兴垦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末温兼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搀擂,老刑警劉巖私痹,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晨川,死亡現(xiàn)場(chǎng)離奇詭異返十,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肛捍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門隐绵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拙毫,你說我怎么就攤上這事依许。” “怎么了缀蹄?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵峭跳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我缺前,道長(zhǎng)蛀醉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任衅码,我火速辦了婚禮拯刁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逝段。我一直安慰自己垛玻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布奶躯。 她就那樣靜靜地躺著帚桩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘹黔。 梳的紋絲不亂的頭發(fā)上账嚎,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼郭蕉。 笑死乏悄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恳不。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼开呐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼烟勋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起筐付,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤卵惦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瓦戚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沮尿,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年较解,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畜疾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡印衔,死狀恐怖啡捶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奸焙,我是刑警寧澤瞎暑,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站与帆,受9級(jí)特大地震影響了赌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玄糟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一勿她、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茶凳,春花似錦嫂拴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至箱沦,卻和暖如春辩恼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工灶伊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疆前,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓聘萨,卻偏偏與公主長(zhǎng)得像竹椒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子米辐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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