javascript - promise和setTimeout執(zhí)行順序的疑惑
問(wèn)題描述
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ì)列嗎?
問(wèn)題解答
回答1:從規(guī)范上來(lái)講,setTimeout有一個(gè)4ms的最短時(shí)間,也就是說(shuō)不管你設(shè)定多少,反正最少都要間隔4ms才運(yùn)行里面的回調(diào)(當(dāng)然,瀏覽器有沒(méi)有遵守這個(gè)規(guī)范是另外一回事兒)。而Promise的異步?jīng)]有這個(gè)問(wèn)題。
從具體實(shí)現(xiàn)上來(lái)說(shuō),這倆的異步隊(duì)列不一樣,Promise所在的那個(gè)異步隊(duì)列優(yōu)先級(jí)要高一些。具體的你可以看這篇文章:從Promise來(lái)看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. mysql 的datadir設(shè)置的文件夾不存在,啟動(dòng)了mysql服務(wù)后創(chuàng)建的數(shù)據(jù)庫(kù)存在哪里?2. 求大神幫我看看是哪里寫錯(cuò)了 感謝細(xì)心解答3. 數(shù)據(jù)庫(kù) - MySQL 單表500W+數(shù)據(jù),查詢超時(shí),如何優(yōu)化呢?4. python - from ..xxxx import xxxx到底是什么意思呢?5. 這是什么情況???6. php自學(xué)從哪里開(kāi)始?7. mysql多表查詢8. phpstudy v8打開(kāi)數(shù)據(jù)庫(kù)就出錯(cuò),而phpstudy 2018不會(huì)9. python 多進(jìn)程 或者 多線程下如何高效的同步數(shù)據(jù)?10. phpstady在win10上運(yùn)行
