亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請各位大佬指點!javascript中異步promise等的執行順序問題各位有什么建議?

請各位大佬指點!javascript中異步promise等的執行順序問題各位有什么建議?

翻閱古今 2019-08-05 23:40:51
下面的一段JS代碼setTimeout(function(){console.log("1")});newPromise(function(resolve){console.log("2")resolve();}).then(function(){console.log("3")})console.log("4")上面的的運行結果是2431百思不得其解,為什么是2先出,setTimeout后面沒有秒數不是應該直接執行嗎?,而且3不是應該在2后面輸出嗎?為什么到4后面了?
查看完整描述

2 回答

?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

setTimeout默認值是0,所以2先出然后不管同步還是異步,在瀏覽器端,Promise會使用MutationObserver監聽一個document.createTextNode(''),然后通過改變node.data的值來觸發observer,執行callback,而在事件循環中,MutationObserver屬于微任務,會比setTimeout先運行
es6-promiseasap.js
constBrowserMutationObserver=browserGlobal.MutationObserver||browserGlobal.WebKitMutationObserver;
functionuseMutationObserver(){
letiterations=0;
constobserver=newBrowserMutationObserver(flush);
constnode=document.createTextNode('');
observer.observe(node,{characterData:true});
return()=>{
node.data=(iterations=++iterations%2);
};
}
if(isNode){
scheduleFlush=useNextTick();
}elseif(BrowserMutationObserver){
scheduleFlush=useMutationObserver();
}elseif(isWorker){
scheduleFlush=useMessageChannel();
}elseif(browserWindow===undefined&&typeofrequire==='function'){
scheduleFlush=attemptVertx();
}else{
scheduleFlush=useSetTimeout();
}
                            
查看完整回答
反對 回復 2019-08-05
  • 2 回答
  • 0 關注
  • 278 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號