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ù)隊列嗎?
問題解答
回答1:從規(guī)范上來講,setTimeout有一個4ms的最短時間,也就是說不管你設(shè)定多少,反正最少都要間隔4ms才運(yùn)行里面的回調(diào)(當(dāng)然,瀏覽器有沒有遵守這個規(guī)范是另外一回事兒)。而Promise的異步?jīng)]有這個問題。
從具體實(shí)現(xiàn)上來說,這倆的異步隊列不一樣,Promise所在的那個異步隊列優(yōu)先級要高一些。具體的你可以看這篇文章:從Promise來看JavaScript中的Event Loop、Tasks和Microtasks
回答2:Promise的任務(wù)會在當(dāng)前事件循環(huán)末尾中執(zhí)行,而setTimeout中的任務(wù)是在下一次事件循環(huán)執(zhí)行
回答3:建議你去看下,<<你不知道的js(中卷)>>中1.5節(jié)左右的內(nèi)容,就理解了~我之前就是看了這個理解的。
相關(guān)文章:
1. 點(diǎn)擊頁面就自動輸入到mysql.求解2. java - IDEA從SVN檢出項(xiàng)目 并在tomcat上運(yùn)行 求詳細(xì)流程3. node.js - nodejs使用formidable上傳文件問題4. javascript - windos下第一次用Django無法正確創(chuàng)建工程目錄5. java - 多叉樹求值,程序高手,算法高手看過來6. node.js - 帶有node_modules目錄的項(xiàng)目,用phpstorm打開速度極慢,怎么解決?7. JAX-RS,GlassFish,Eclipse。簡單的Web服務(wù)不起作用8. java如何生成token?9. 單擊登錄按鈕無反應(yīng)10. 靜態(tài)資源文件引入無效
