为了账号安全,请及时绑定邮箱和手机立即绑定

有没有人遇到过这个问题哈!javascript中异步promise等的执行顺序问题大佬们有什么好的建议?

有没有人遇到过这个问题哈!javascript中异步promise等的执行顺序问题大佬们有什么好的建议?

慕无忌1623718 2019-07-14 22:03:27
下面的一段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.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-07-14
  • 2 回答
  • 0 关注
  • 254 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信