The event loop is what allows Node.js to perform non-blocking I/O operations — despite the fact that JavaScript is single-threaded — by offloading operations to the system kernel whenever possible.

详情见下图

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

001--Node.js之EventLoop 随笔 第1张

 

 

001--Node.js之EventLoop 随笔 第2张

我们都知道JS是单线程的,当一个任务进入Node.js解释器的执行栈后,会首先看是同步还是异步代码,同步会推入主线程进行解释,异步代码会推入eventLoop事件循环中,这些任务会分为宏任务或者微任务,当执行栈中没有同步代码时,会先执行宏任务:主体script,setTimeout,setInterval,后执行微任务Promise.then,process.nextTick

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(() => {

    // 宏任务
    new Promise(resolve => {
        console.log('promise')
        resolve();
    }).then(() => {
        //微任务
        console.log('then')
    });

    // 宏任务
    console.log('宏任务',1);
    // 宏任务
    setTimeout(() => {

        console.log('setTimeout',1)

    }, 1000);

}, 1000);
2
// promise
//宏任务 1
//then
//setTimeout 1
console.log('script start');

setTimeout(function() {
    
    new Promise((resolve)=>{}).then()

    setTimeout(function() {
    
    }, 0);

}, 0);

new Promise(resolve => {
    console.log('promise start');
    setTimeout(() => {
        console.log('setTimeout2');
        resolve();
    }, 1000)
}).then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');
//script start
// promise start
// script end
// setTimeout2
// promise1
// promise2

001--Node.js之EventLoop 随笔 第3张

 2019-05-10  17:11:45

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄