我的JS筆記 -- 異步任務(wù)


JS是單線程的(所謂單線程褐健,是指在JS引擎中負(fù)責(zé)解釋和執(zhí)行JavaScript代碼的線程只有一個(gè)韩肝,叫主線程),就是說JS同一時(shí)間只能處理一件事影晓。那么就可能出現(xiàn)這種情況:一件事需要花費(fèi)很長(zhǎng)時(shí)間處理迷守,后面的事情只能等待犬绒,體驗(yàn)就非常差。

所以JS中將執(zhí)行的任務(wù)分為兩類:同步任務(wù)和異步任務(wù)兑凿。

同步任務(wù)懂更,同步任務(wù)指的是眨业,發(fā)出調(diào)用立即獲得結(jié)果的為同步任務(wù)急膀。同步任務(wù)會(huì)在調(diào)用之后一直等待沮协,直到返回結(jié)果。

異步任務(wù)卓嫂,異步任務(wù)指的是慷暂,發(fā)出調(diào)用,但無法立即獲得結(jié)果晨雳,需要額外的操作才能得到預(yù)期的結(jié)果的為異步任務(wù)行瑞。調(diào)用之后和拿到結(jié)果之間,可以進(jìn)行其他操作餐禁。

JS運(yùn)行環(huán)境運(yùn)行機(jī)制

  1. 所有同步任務(wù)都在主線程上執(zhí)行血久,形成一個(gè)執(zhí)行棧;
  2. 主線程之外帮非,還存在一個(gè)任務(wù)隊(duì)列(一個(gè)先進(jìn)先出的隊(duì)列氧吐,里面放著各種事件)。只要異步任務(wù)有了運(yùn)行結(jié)果末盔,就在任務(wù)隊(duì)列之中放置一個(gè)事件筑舅;
  3. 一旦執(zhí)行棧中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取任務(wù)隊(duì)列陨舱,看看里面有哪些事件翠拣。那些對(duì)應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài)游盲,進(jìn)入執(zhí)行棧误墓,開始執(zhí)行;
  4. 主線程不斷重復(fù)上面的第三步益缎;

所以執(zhí)行棧中的代碼(同步任務(wù))谜慌,總是在讀取任務(wù)隊(duì)列(異步任務(wù))之前執(zhí)行

事件和回調(diào)函數(shù)

事件,所謂的事件驅(qū)動(dòng)就是將一切抽象為事件链峭。I/O操作完成是一個(gè)事件畦娄,用戶點(diǎn)擊是一個(gè)事件,Ajax完成是一個(gè)事件弊仪,一個(gè)圖片加載完成是一個(gè)事件熙卡,當(dāng)產(chǎn)生事件后,這個(gè)事件會(huì)被放入任務(wù)隊(duì)列中等待被處理励饵。

回調(diào)函數(shù)驳癌,與事件關(guān)聯(lián)的函數(shù),會(huì)在執(zhí)行事件時(shí)調(diào)用役听。

setTimeout(fn, 1000); // 例如setTimeout時(shí)間到了就會(huì)對(duì)應(yīng)一個(gè)事件颓鲜,而fn就是事件執(zhí)行時(shí)調(diào)用的回調(diào)函數(shù)

事件循環(huán)(event loop)

主線程只會(huì)做一件事情表窘,就是從任務(wù)隊(duì)列里面取事件、執(zhí)行事件甜滨,再取事件乐严、再執(zhí)行。當(dāng)任務(wù)隊(duì)列為空時(shí)衣摩,就會(huì)等待直到任務(wù)隊(duì)列變成非空昂验。而且主線程只有在將當(dāng)前的事件執(zhí)行完成后,才會(huì)去取下一個(gè)事件艾扮。這種機(jī)制就叫做事件循環(huán)機(jī)制既琴,取一個(gè)消息并執(zhí)行的過程叫做一次循環(huán)。

setTimeout(function () {
    console.log(1);
}, 0);
console.log(2);

// 2
// 1

// setTimeout(..) 并不是直接把回調(diào)函數(shù)掛在任務(wù)隊(duì)列中泡嘴。它所做的是設(shè)定一個(gè)定時(shí)器甫恩。當(dāng)定時(shí)器到時(shí)后,相當(dāng)于產(chǎn)生了一個(gè)時(shí)間到了的事件酌予,這個(gè)事件進(jìn)入任務(wù)隊(duì)列磺箕。這樣,下個(gè)事件循環(huán)主線程會(huì)取出并執(zhí)行這個(gè)事件的回調(diào)函數(shù)
// 因?yàn)橹骶€程會(huì)先執(zhí)行完執(zhí)行棧中的同步任務(wù)霎终,才會(huì)去任務(wù)隊(duì)列提取事件滞磺,所以異步任務(wù)的回調(diào)函數(shù)總是在同步任務(wù)知乎執(zhí)行
// 但如果任務(wù)隊(duì)列中已經(jīng)有多個(gè)事件排隊(duì),那么就會(huì)導(dǎo)致setTimeOut的函數(shù)延后運(yùn)行莱褒,這就是為什么setTimeOut和setInterval不準(zhǔn)確的原因


for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(new Date());
    }, 1000);
}
console.log(new Date());

// 先輸出一個(gè)日期击困,一秒后再幾乎同時(shí)輸出五個(gè)日期,但可以看出五個(gè)日期有細(xì)微的差別广凸,這些誤差就是因?yàn)槿蝿?wù)隊(duì)列中有多個(gè)事件排隊(duì)導(dǎo)致后邊事件延遲的結(jié)果

更多文章在 這里 阅茶,覺得不錯(cuò)希望點(diǎn)個(gè) star

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谅海,隨后出現(xiàn)的幾起案子脸哀,更是在濱河造成了極大的恐慌,老刑警劉巖扭吁,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撞蜂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侥袜,警方通過查閱死者的電腦和手機(jī)蝌诡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枫吧,“玉大人浦旱,你說我怎么就攤上這事【旁樱” “怎么了颁湖?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵宣蠕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我甥捺,道長(zhǎng)抢蚀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任涎永,我火速辦了婚禮思币,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羡微。我一直安慰自己,他們只是感情好惶我,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布妈倔。 她就那樣靜靜地躺著,像睡著了一般绸贡。 火紅的嫁衣襯著肌膚如雪盯蝴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天听怕,我揣著相機(jī)與錄音捧挺,去河邊找鬼。 笑死尿瞭,一個(gè)胖子當(dāng)著我的面吹牛闽烙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播声搁,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼黑竞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了疏旨?” 一聲冷哼從身側(cè)響起很魂,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎檐涝,沒想到半個(gè)月后遏匆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谁榜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年幅聘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惰爬。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喊暖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撕瞧,到底是詐尸還是另有隱情陵叽,我是刑警寧澤狞尔,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站巩掺,受9級(jí)特大地震影響偏序,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胖替,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一研儒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧独令,春花似錦端朵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至招狸,卻和暖如春敬拓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裙戏。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工乘凸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人累榜。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓营勤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親信柿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冀偶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴渔嚷。进鸠。 不如我直接引用一個(gè)最簡(jiǎn)單的問題,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,734評(píng)論 1 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,515評(píng)論 25 707
  • 弄懂js異步 講異步之前形病,我們必須掌握一個(gè)基礎(chǔ)知識(shí)-event-loop客年。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,697評(píng)論 0 5
  • 文 | 圖 諾諾媽_Fairy 唔…你冷嗎? 你…你……你說呢……(抖…抖…抖) 作品名:怕冷的長(zhǎng)頸鹿 畫紙:空白...
    諾諾媽FAIRY閱讀 1,794評(píng)論 3 53
  • 不是燦若云霞漠吻, 亦非蓮開半夏量瓜, 白衣飄飄的冬姑娘啊, 只一個(gè)回眸途乃,世界便一片清涼绍傲。 任它西風(fēng)烈, 任它斷枝離, 索...
    芣苡zx閱讀 322評(píng)論 0 2