js微任务宏任务Event-loop

2020-03-06  本文已影响0人  passenger_z

js微任务宏任务Event-loop

js是单线程的语言当我们触发alert之后如果不关闭,后面的console.log是不会执行的

分为异步任务和同步任务


捕获.JPG
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');

执行这个代码发现输出的值是script start, script end, promise1, promise2, setTimeout ,为什么会是这样执行的,setTimeout为什么在最后面。这就是执行的异步任务语句分为宏任务和微任务。

执行的顺序

setTimeout细节

setTimeout(() => {
    task()
},3000)

sleep(10000000)

task开始进入eventTable ,task并不会在三秒后执行,三秒后task进入event queue,要等sleep完成再会执行

setInterval细节

setInterval和setTimeout差不多,但是不同的是每隔多少秒就会把任务放入到eventQueue中


2.jpg
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时是同步任务

输出结果是 1,7,6,8,2,4,3,5,9,11,10,12。

总结一下就是先执行同步任务,异步任务放入到event table中,异步任务分为宏任务,微任务,先按顺序执行微任务,将微任务拆分,执行里面的同步任务,异步任务放入到event table中,执行完毕执行宏任务。同理宏任务也是拆解执行同步任务,异步任务一样进入event table。当这个宏任务拆解完,可能会出现微任务。那么还是先执行微任务。

上一篇 下一篇

猜你喜欢

热点阅读