先来道今日头条面试题开开胃
async function async1() { console.log('async1 start'); await async2(); console.log('async1 end'); } async function async2() { console.log('async2'); } console.log('script start'); setTimeout(function() { console.log('setTimeout'); }, 0) async1(); new Promise(function(resolve) { console.log('promise1'); resolve(); }).then(function() { console.log('promise2'); }); console.log('script end');
/**
* scripr start
* async1 start
* async2
* promise1
* scroptend
* async1end
* promise2
* setimeout
*/
执行结果是不是和你想的有些不同?下面是我查阅资料后总结的同步任务和异步任务的执行顺序
1、不管是同步还是异步,js都会按顺序执行,只是不等待异步的执行结果而已(并不是遇到异步的就绕过不执行,别蒙了)
2、同步的任务没有优先级之分,异步执行有优先级,先执行微任务(microtask队列),再执行宏任务(macrotask队列),同级别按顺序执行
微任务: `process.nextTick` ,`promise` ,`MutationObserver`
宏任务:`script` , `setTimeout` ,`setInterval` ,`setImmediate` ,`I/O` ,`UI rendering`
3、await表示让出线程,继续执行后面的函数(执行当前函数后面的函数,不是当前函数里面的)