project中的macro-task和micro-task

單線程玖翅,eventLoop 這是關(guān)鍵字,其他都是浮云割以。
眾所周知金度,javascript是單線程的,也就是說干活的就一條主線程拳球,那么異步是怎么回事呢审姓?
把代碼張三抬上來:

setTimeout(() => {
    console.log('timeout');
},300)珍特;
console.log('main process')

99%的前端從業(yè)者都知道先打印main process 后打印timeout祝峻,再次也不必多啰嗦了。
把代碼李四抬上來:

setTimeout(() => {
    console.log('timeout');
},300)扎筒;
sleep(2000);

假設(shè)下面的同步操作執(zhí)行了2000ms莱找,那么timeout會在大于2000ms后才執(zhí)行打印操作,并不是真實(shí)的300ms嗜桌,那么就能猜到原理了吧奥溺,就是一個(gè)主線程隊(duì)列和異步線程隊(duì)列唄,先執(zhí)行完主線程隊(duì)列骨宠,才輪的上異步線程隊(duì)列執(zhí)行啊浮定。
另外相满,setTimeout的的最低延遲是4ms,所以設(shè)置為0也是騙人的桦卒。
另外setInterval同理立美,也是每隔一段時(shí)間會往異步線程里面推一下。
把代碼王五抬上來:

setTimeout(function() {
    console.log('setTimeout');
})
new Promise(function(resolve) {
    console.log('promise');
    resolve();
}).then(function() {
    console.log('then');
})
console.log('console');

如何打印呢?答案是promise方灾,console建蹄,then,setTimeout
為啥呢裕偿?
其實(shí)js除了同步任務(wù)和異步任務(wù)洞慎,還細(xì)分為宏任務(wù)和微任務(wù);

  • macro-task(宏任務(wù)):包括整體代碼script嘿棘,setTimeout劲腿,setInterval
  • micro-task(微任務(wù)):Promise,process.nextTick
    然后我們分析一下代碼王五蔫巩;
    代碼開始執(zhí)行谆棱,整體就是一個(gè)宏任務(wù),遇到了setTimeout 發(fā)現(xiàn)這玩意是一個(gè)異步任務(wù)圆仔,而且是宏任務(wù)垃瞧,先丟一邊兒,然后遇到了一個(gè)promise坪郭,發(fā)現(xiàn)這玩意是個(gè)當(dāng)前宏任務(wù)下的一個(gè)微任務(wù)个从,然后就執(zhí)行了一下console.log('promise'),然后就丟到一邊去歪沃,然后遇到了一個(gè)console.log('console'); 截止到目前為止嗦锐,共打印了promise和console,然后開始執(zhí)行本次的微任務(wù)沪曙,即then奕污,然后執(zhí)行異步隊(duì)列的宏任務(wù),就是setTimeout液走,所以打印順序就是這樣滴碳默。

把代碼趙六抬上來:

console.log('1');

setTimeout(function() {
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})
process.nextTick(function() {
    console.log('6');
})
new Promise(function(resolve) {
    console.log('7');
    resolve();
}).then(function() {
    console.log('8')
})

setTimeout(function() {
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
})

這段代碼就有點(diǎn)兒牛逼了啊,這玩意是啥霸悼簟嘱根?
讓我們一點(diǎn)點(diǎn)兒分析哈。

首先代碼們開始執(zhí)行巷懈,即宏任務(wù)開始该抒,打印 【1】,遇到了setTimeout丟到異步隊(duì)列里面顶燕,然后遇到了process.nextTick(當(dāng)前隊(duì)列的微任務(wù))凑保,然后遇到了Promise冈爹,打印【7】,丟到微任務(wù)隊(duì)列里欧引,然后遇到了
setTimeout犯助,丟到異步隊(duì)列里面去,然后開始執(zhí)行本次的微任務(wù)维咸,打印【6】和【8】剂买,第一次執(zhí)行完了,打印了【1】【7】【6】【8】
接下來分析異步隊(duì)列啦~
首先第一個(gè)timeout打印一個(gè)【2】癌蓖,然后遇到了兩個(gè)微任務(wù)瞬哼,先打印【4】,然后開始執(zhí)行微任務(wù)租副,打印【3】和【5】 到此為止坐慰,第一個(gè)異步任務(wù)的全部執(zhí)行完了,現(xiàn)在打印的結(jié)果是【1】【7】【6】【8】【2】【4】【3】【5】用僧,然后開始執(zhí)行下面的timeout结胀,結(jié)果和第一個(gè)類似,所以最終的打印結(jié)果是:
【1】【7】【6】【8】【2】【4】【3】【5】【9】【11】【10】【12】
看到這里责循,應(yīng)該對js的同步糟港,異步,宏任務(wù)院仿,微任務(wù)了如指掌了吧秸抚,那么開始你的編程之旅吧!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歹垫,一起剝皮案震驚了整個(gè)濱河市剥汤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌排惨,老刑警劉巖吭敢,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暮芭,居然都是意外死亡鹿驼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門谴麦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢沿,“玉大人伸头,你說我怎么就攤上這事匾效。” “怎么了恤磷?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵面哼,是天一觀的道長野宜。 經(jīng)常有香客問我,道長魔策,這世上最難降的妖魔是什么匈子? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮闯袒,結(jié)果婚禮上虎敦,老公的妹妹穿的比我還像新娘。我一直安慰自己政敢,他們只是感情好其徙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喷户,像睡著了一般唾那。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褪尝,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天闹获,我揣著相機(jī)與錄音,去河邊找鬼河哑。 笑死避诽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的璃谨。 我是一名探鬼主播茎用,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睬罗!你這毒婦竟也來了轨功?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤容达,失蹤者是張志新(化名)和其女友劉穎古涧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體花盐,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羡滑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了算芯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柒昏。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熙揍,靈堂內(nèi)的尸體忽然破棺而出职祷,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布有梆,位于F島的核電站是尖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泥耀。R本人自食惡果不足惜饺汹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痰催。 院中可真熱鬧兜辞,春花似錦、人聲如沸夸溶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜘醋。三九已至胁塞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間压语,已是汗流浹背啸罢。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胎食,地道東北人扰才。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像厕怜,于是被迫代替她去往敵國和親衩匣。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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