执行的结果顺序是什么?为什么?
发布于 4 个月前 作者 yuelau 689 次浏览 来自 问答
function execOrder () {
  setTimeout(() => console.log('timeout'), 0)
  let promise = new Promise((resolve, reject) => {
	console.log('Promise')
	resolve()
  })
  promise
  	.then(() => {
  		console.log('resolved')
  	})
  console.log('hi')
}
// 结果顺序是?
7 回复

setTimeout最后执行 new Promise 和 console.log(‘hi’)同步执行 promise.then 异步执行

这个问题应该是js的事件运行机制的问题,首先js是单线程,所以只能一个一个的处理任务,会造成服务器资源浪费,于是出现了异步的概念。同步任务 会直接在js主线程上排队等待,而异步任务则进入任务队列,当主线程没有任务的时候会去任务队列中取一个出来。你的代码中又两个同步操作,两个异步操作。定义promise是和输出hi过一个同步的过程,所以这两个一定会先执行,因为他们是在主线程上排队的,(只有主线程上没有任务的时候才会去任务队列中取),至于异步的执行顺序setTimeout()的时间为0时是如何确定加入任务队列的可以去看看他的实现或许会有收获。

单线程: 同步的按照顺序先执行. new Promise里面的是会在promise生成时候就执行. 因此先打印出 promise. 接着就是 hi. 稍微比较难理解的就是resolved为什么早于timeout输出. 这里有个重点. Promise的队列与setTimeout的队列的有何关联? 有一个事件循环,但是任务队列可以有多个。整个script代码,放在了macrotask queue中,setTimeout也放入macrotask queue。但是,promise.then放到了另一个任务队列microtask queue中。这两个任务队列执行顺序如下,取1个macrotask queue中的task,执行之。然后把所有microtask queue顺序执行完,再取macrotask queue中的下一个任务。

可以参考下面链接. https://www.zhihu.com/question/36972010

promise hi resolved timeout

@1657413883 参考链接很精彩

需要了解js的运行机制 宏任务 微任务

@guo-q 恩,从一些参考资料上看: 两个分支:(同步先于异步执行) 同步(new Promise 与 console.log) 异步 (then调用 与 setTimeout): then是本次事件循环最后调用, setTimeout是下次事件循环调用 所以执行顺序是: new Promise() console.log then setTimeout

回到顶部