console.log('main1')
new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
})
console.log('promise1')
}).then(() => {
console.log('promise2')
})
setTimeout(() => {
console.log('settimeout')
}, 0)
console.log('main2')
执行次序为同步任务、微任务、宏任务
resolve、reject是微任务,
定时器是宏任务。new Promise会立即执行,
.then函数是Promise示例 resolve之后才会执行。
你自己看一下吧。。我现在理解得就是这样
首先执行主程序,输出main1;new Promise的时候,Promise的构造函数会执行(resolve, reject) => {setTimeout(() => {resolve()})console.log('promise1')},并将这个实例的resolve和reject方法注入这个方法,执行setTimeout,浏览器生成一个异步的计时器,输出promise1;往下走,执行then会将里面的函数放入当前实例对应的队列里面(resolve队列或者reject队列),并返回一个新的Promise实例,以便可以继续使用then方法;继续走,又遇到一个setTimeout,继续生成一个计时器;最后输出main2。
然后,计时器时间到后会将回调往宏任务队列里面丢,丢了两个resolve()和console.log('settimeout');先执行resolve(),会执行对应Promise实例里面的resolve队列里面的函数(也就是前面执行then放进去的),这个时候会生成一个微任务,丢到微任务队列里面;到这一步,setTimeout里面的resolve执行完了,因为微任务队列有值,即执行() => {console.log('promise2')},输出promise2;最后执行console.log('settimeout'),输出settimeout。至此程序执行完毕。
https://juejin.cn/post/6844903512845860872 js运行机制了解一下,事件循环,宏任务与微任务