下面的一段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贡献1808条经验 获得超4个赞
setTimeout默认值是0,所以2先出然后不管同步还是异步,在浏览器端,Promise会使用MutationObserver监听一个document.createTextNode(''),然后通过改变node.data的值来触发observer,执行callback,而在事件循环中,MutationObserver属于微任务,会比setTimeout先运行es6-promiseasap.jsconstBrowserMutationObserver=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();}
添加回答
举报
0/150
提交
取消