同步任务和异步任务
由于javascript是一门单线程导致后面的任务需要等到前面的任务完成才能执行,如果前面的任务很耗时就会造成后面的任务一直等待。为了解决这个问题,JavaScript 将主线程中的任务分为同步任务和异步任务。 同步任务:是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。 异步任务:不进入主线程、通过事件循环机制处理,在任务队列中注册回调函数最终拿到结果。 异步任务又分为宏任务和微任务 常见的宏任务有: setTimeout,setInterval,DOM事件,ajax请求 常见的微任务:promise的then,async/await,(注意:promise是同步任务)
执行顺序:
1、同步任务>微任务>宏任务 2、每次执行完宏任务,又会重新查看有没有微任务。
console.log("script start");
setTimeout(function() {
console.log("setTimeout---0");
}, 0);
setTimeout(function() {
console.log("setTimeout---200");
setTimeout(function() {
console.log("inner-setTimeout---0");
});
Promise.resolve().then(function() {
console.log("promise5");
});
}, 200);
Promise.resolve()
.then(function() {
console.log("promise1");
})
.then(function() {
console.log("promise2");
});
Promise.resolve().then(function() {
console.log("promise3");
}).then(function() {
console.log("promise4");
});
console.log("script end");
1首先从上往下清理同步任务: 可以得到:script start script end 2是清理微任务:第一个then优先级更高:promise1 promise3 然后就是:promise2 promise4 3然后就是清理宏任务,又可以得到:setTimeout—0 setTimeout—200 4宏任务执行完后又有一个微任务和宏任务,先清理微任务可以得到: promise5 inner-setTimeout—0 结果如下:
script start
script end
promise1
promise3
promise2
promise4
setTimeout---0
setTimeout---200
promise5
inner-setTimeout---0
|