javascript - promise和setTimeout執(zhí)行順序的疑惑
問題描述
setTimeout(function () { console.log(1)}, 0);new Promise(function executor(resolve) {resolve();}).then(function () { console.log(2);});
如上代碼,為什么運(yùn)行結(jié)果是2,1而不是1,2?不是setTimeout先加入任務(wù)隊(duì)列嗎?
問題解答
回答1:從規(guī)范上來講,setTimeout有一個(gè)4ms的最短時(shí)間,也就是說不管你設(shè)定多少,反正最少都要間隔4ms才運(yùn)行里面的回調(diào)(當(dāng)然,瀏覽器有沒有遵守這個(gè)規(guī)范是另外一回事兒)。而Promise的異步?jīng)]有這個(gè)問題。
從具體實(shí)現(xiàn)上來說,這倆的異步隊(duì)列不一樣,Promise所在的那個(gè)異步隊(duì)列優(yōu)先級(jí)要高一些。具體的你可以看這篇文章:從Promise來看JavaScript中的Event Loop、Tasks和Microtasks
回答2:Promise的任務(wù)會(huì)在當(dāng)前事件循環(huán)末尾中執(zhí)行,而setTimeout中的任務(wù)是在下一次事件循環(huán)執(zhí)行
回答3:建議你去看下,<<你不知道的js(中卷)>>中1.5節(jié)左右的內(nèi)容,就理解了~我之前就是看了這個(gè)理解的。
相關(guān)文章:
1. python - 為什么正常輸出中文沒有亂碼,zip函數(shù)之后出現(xiàn)中文編程unicode編碼的問題,我是遍歷輸出的啊。2. 對(duì)mysql某個(gè)字段監(jiān)控的功能3. showpassword里的this 是什么意思?代表哪個(gè)元素4. mysql優(yōu)化 - mysql EXPLAIN之后怎么看結(jié)果進(jìn)行優(yōu)化 ?5. html - vue項(xiàng)目中用到了elementUI問題6. JavaScript事件7. javascript - 原生canvas中如何獲取到觸摸事件的canvas內(nèi)坐標(biāo)?8. css3 - border-bottom 的長度可否超過盒子的寬度呢?實(shí)現(xiàn)如下圖效果。(我的書下面的線)9. css3 - css怎么實(shí)現(xiàn)圖片環(huán)繞的效果10. mysql scripts提示 /usr/bin/perl: bad interpreter
