//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狀態一旦改變就不會再變化了。