js微任務(wù)宏任務(wù)Event-loop
js是單線程的語言當(dāng)我們觸發(fā)alert之后如果不關(guān)閉,后面的console.log是不會(huì)執(zhí)行的无埃。
分為異步任務(wù)和同步任務(wù)
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
Promise.resolve().then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});
console.log('script end');
執(zhí)行這個(gè)代碼發(fā)現(xiàn)輸出的值是script start, script end, promise1, promise2, setTimeout ,為什么會(huì)是這樣執(zhí)行的隘截,setTimeout為什么在最后面铲咨。這就是執(zhí)行的異步任務(wù)語句分為宏任務(wù)和微任務(wù)。
執(zhí)行的順序:
而宏任務(wù)一般是:包括整體代碼script蒜鸡,setTimeout畜眨,setInterval、setImmediate术瓮。
微任務(wù):原生Promise康聂、process.nextTick、Object.observe(已廢棄)胞四、 MutationObserver 記住就行了恬汁。
Promise在new的時(shí)候是同步的,then辜伟,catch才是異步
setTimeout細(xì)節(jié)
setTimeout(() => {
task()
},3000)
sleep(10000000)
task開始進(jìn)入eventTable 氓侧,task并不會(huì)在三秒后執(zhí)行,三秒后task進(jìn)入event queue导狡,要等sleep完成再會(huì)執(zhí)行
setInterval細(xì)節(jié)
setInterval和setTimeout差不多约巷,但是不同的是每隔多少秒就會(huì)把任務(wù)放入到eventQueue中
console.log('1');
setTimeout(function() {
console.log('2');
process.nextTick(function() {
console.log('3');
})
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
process.nextTick(function() {
console.log('6');
})
new Promise(function(resolve) {
console.log('7');
resolve();
}).then(function() {
console.log('8')
})
setTimeout(function() {
console.log('9');
process.nextTick(function() {
console.log('10');
})
new Promise(function(resolve) {
console.log('11');
resolve();
}).then(function() {
console.log('12')
})
})
在new Promise時(shí)是同步任務(wù)
輸出結(jié)果是 1,7旱捧,6独郎,8,2枚赡,4氓癌,3,5贫橙,9贪婉,11,10卢肃,12疲迂。
總結(jié)一下就是先執(zhí)行同步任務(wù),異步任務(wù)放入到event table中莫湘,異步任務(wù)分為宏任務(wù)尤蒿,微任務(wù),先按順序執(zhí)行微任務(wù)逊脯,將微任務(wù)拆分优质,執(zhí)行里面的同步任務(wù),異步任務(wù)放入到event table中,執(zhí)行完畢執(zhí)行宏任務(wù)巩螃。同理宏任務(wù)也是拆解執(zhí)行同步任務(wù)演怎,異步任務(wù)一樣進(jìn)入event table。當(dāng)這個(gè)宏任務(wù)拆解完避乏,可能會(huì)出現(xiàn)微任務(wù)爷耀。那么還是先執(zhí)行微任務(wù)。