//题1 setTimeout(function () { console.log(1); }, 1000); setTimeout(function () { console.log(2); }, 0); //所有setTimeout定义的操作都会放在一个队列中,等待函数调用栈(所有可执行代码)执行完毕后才会执行 new Promise(function (resolve, reject) { console.log(3);//立即触发1 resolve(); }).then(() => { console.log(4);//异步后触发1 }); async function async1() { console.log(5);//立即触发2 await async2(); console.log(6);//异步后触发2 } async function async2() { console.log(7);//立即触发3 } async1(); console.log(8);//立即触发4 //3 5 7 8 4 6 2 1
//题2 async function async1() { console.log('async1 start');//调用后立即执行 await async2(); console.log('async1 end'); } async function async2() { console.log('async2');//调用后立即执行 } console.log('script start');//立即执行1 setTimeout(function () { console.log('settimeout'); }, 0); async1(); new Promise(function (resolve) { console.log('promise1');//立即执行 resolve(); }).then(function () { console.log('promise2'); }); console.log('script end');//立即执行 //script start (立即执行) //async1 start (立即执行) //async2 (立即执行) //promise1 (立即执行) //script end (立即执行) //async1 end(异步队列1) //promise2(异步队列2) //settimeout(异步队列3) //注意: setTimeOut并不是直接的把你的回掉函数放进上述的异步队列中去,而是在定时器的时间到了之后,把回掉函数放到执行异步队列中去。如果此时这个队列已经有很多任务了,那就排在他们的后面。这也就解释了为什么setTimeOut为什么不能精准的执行的问题了。