1.Promise正常resolve 正常.then
const promise = new Promise((resolve,reject)=>{
console.log(1);
resolve('success')
console.log(2);
})
promise.then(()=>{
console.log(3);
})
console.log(4);
首先我们先创建了一个变量promise来接收promise对象
注意:在创建Promise的时候,回调函数里的代码是同步立即执行的。所以先输出1
紧接着碰到了resolve,这里将promise的状态改为了完成,并且后续可以使用.then方法接收reslove中的参数
输出2
这时遇到.then方法,我们将其加入微任务队列,不执行。
输出4
这时候作用域中已经没有宏任务了,我们检查微任务队列,输出3
结果:1243
2.Promise不resolve 正常.then
const promise = new Promise((resolve,reject)=>{
console.log(1);
console.log(2);
})
promise.then(()=>{
console.log(3);
})
console.log(4);
同上 首先我们先创建了一个变量promise来接收promise对象
注意:在创建Promise的时候,回调函数里的代码是同步立即执行的。所以先输出1
紧接着碰到了resolve,这里将promise的状态改为了完成
输出2
这时遇到.then方法,犹豫我们并没有在promise中resolve或者rejecty,因此不执行。
输出4
结果:124
3.setTimeout+.then()
console.log('start');
setTimeout(()=>{
console.log('time');
})
Promise.resolve(().then(()=>{
console.log('resolve');
}))
console.log('end');
我们需要将当前代码的执行环境当成第一个宏任务
首先来到第一行 输出start是没有问题的
紧接着我们会遇到定时器 我们将其放入下一个宏任务队列(第二个宏任务) 暂不执行里面的代码
遇到了.resolve状态下的.then,此时我们需要将其看成一个整体 也就是说他这里就只是一个.then,我们将其加入第一个宏任务的微任务队列 暂不执行
输出end
现在开始检查第一个宏任务的微任务 发现有一个微任务 执行resolve
微任务检查完 开始执行第二个宏任务队列 输出定时器里面的time
结果:start end resolve time