//promise执行顺序 const first = () => new Promise((resolve, reject) => { console.log(1);//1 let p = new Promise((resolve, reject) => { console.log(2);//2 setTimeout(() => { console.log(6);//6 resolve(7) //7 }, 0); resolve(4); }); resolve(5); p.then(arg => { console.log('p.then'+arg);//4 }); }); first().then(arg => { console.log('first.then'+arg);//5 }); console.log(3);//3
//这道题主要理解js执行机制。执行顺序123456
// 第一轮事件循环,先执行宏任务,主script,new Promise立即执行,输出 1,执行p这个new Promise操作,输出 2,发现setTimeout,将回调函数放入下一轮任务队列(Event Quene),p的then,暂且命名为then1,放入微任务队列,且first也有then,命名为then2,放入微任务队列。执行console.log(3),输出 3,宏任务执行结束。
// 再执行微任务,执行then1,输出 4,执行then2,输出 5。
// 第一轮事件循环结束,开始执行第二轮。第二轮事件循环先执行宏任务里面的,也就是setTimeout的回调,输出 6。resolve(7)不会生效,因为p的Promise状态一旦改变就不会再变化了。