JS中异步分为微任务和宏任务
要了解微任务与宏任务就要知道JS代码运行的顺序。
JS是单线程,也就是事情只能一个个去做。
JS是先执行完主线程的任务后才去执行任务队列。
任务队列:在JS运行时,先执行同步的代码,而异步的代码则会挂到任务队列中,等主线程执行完成后才执行任务队列的异步代码。
console.log(1);
console.log(2);
setTimeout(()=>{
console.log(3);
},0);
console.log(4);
先了解上面代码的执行顺序:
先执行主线程的代码,所以先输出 1,2 遇到setTimeout时,因为setTimeout是异步,所以会将它挂到任务队列里先,然后继续主线程的执行,再输出4,主线程完成了,JS就会执行任务队列的代码,所以最后输出3。
输出顺序为 1,2,4,3
异步可以分为微任务和宏任务。
常见的宏任务:setTimeout、setInterval、DOM事件、setImmediate
常见的微任务:Promise、process.nextTick
最重要——微任务优先于宏任务
console.log(1);
console.log(2);
setTimeout(()=>{
console.log(3);
},0);
console.log(4);
Promise.resolve().then(()=>{
console.log(5);
}
先分析上面的代码就会对微任务与宏任务更深的了解;
JS先执行主线程的代码,所以先输出1,2 遇到setTimeout了,就把setTimeout挂到任务队列中,继续执行主线程的代码,输出4,遇到Promise了,也把Promise挂到任务队列中;所以目前先输出1,2,4;在任务队列中,Promise是微任务,优先于宏任务,所以Promise先执行,输出5,setTimeout最后执行,输出3。
顺序为:1,2,4,5,3。
Event Loop也叫JS事件循环机制;
我们已经知道JS代码运行除了主线程还有任务队列;Event Loop指的就是主线程执行完了,JS就会在任务队列里获取任务,任务完成后又会再回到任务队列里再次获取任务,就这样不断循环。