美文网首页
事件循环

事件循环

作者: yanmingfei | 来源:发表于2019-10-13 10:45 被阅读0次

Node事件环

  • 微任务的概念(promise.then process.nextTick)
  • timers 时间 setTimeout setInterval
  • poll 轮询 i/o回调 fs.readFile()
  • check setImmediate方法

默认会从上到下依次执行,如果代码执行到poll后,发现check阶段没有,那就在poll阶段等待(时间到没到)时间到达到清空代码执行。
和浏览器不太一样的是,浏览器是在执行宏任务就把内部的微任务优先执行。
node则是执行只要队列发生切换时就会执行微任务。

setTimeout(()=>{
  console.log('timeout')
})
console.log('start');
process.nextTick(()=>{
  console.log('nextTick');
});
Promise.resolve().then(data=>{
  console.log('then')
})

代码执行顺序为先执行主任务,console.log('start');然后开始切换时间队列定时器,只要队列发生切换就会执行微任务。所以会执行nextTick()和Promise的then方法,再执行定时器中的代码。
看到这里大家就会就觉得和浏览器的事件循环好像一模一样呀。其实不然,有时会有差异。这个千万小心。

setTimeout(()=>{
  console.log('timeout1')
  process.nextTick(()=>{
    console.log('nextTick2');
  });
})
console.log('start');
process.nextTick(()=>{
  console.log('nextTick1');
  setTimeout(()=>{
    console.log('timeout2')
  })
});

这段代码的执行结果可以是
第一种情况:
start nextTick1 timeout1 nextTick2 timeout2
第二种情况
start nextTick1 timeout1 timeout2 nextTick2 这种情况在debug下,我们刻意延迟时间,让代码执行。最终会发现执行结果如下。

setTimeout(()=>{
  console.log('timeout1')
  process.nextTick(()=>{
    console.log('nextTick2');
  });
})
console.log('start');
process.nextTick(()=>{
  console.log('nextTick1');
  setTimeout(()=>{
    console.log('timeout2')
  })
});

setImmediate(()=>{
  console.log('setImmediate');
});
setTimeout(()=>{
  console.log('setTimeout');
})

这段代码的执行结果也有很多情况
第一种情况
start nextTick1 timeout1 nextTick2 setImmediate setTimeout timeout2
第二种情况
start nextTick1 timeout1 setTimeout nextTick2 setImmediate timeout2
第三种情况
start nextTick1 timeout1 setTimeout timeout2 nextTick2 setImmediate

切换队列的情况: 把队列清空、如果执行大量的回调,超过了最大限制,就会切换队列

经典面试题

const fs = require('fs');
fs.readFile('./package.json','utf-8',()=>{
  setTimeout(()=>{
    console.log('setTimeout');
  });
  setImmediate(()=>{
    console.log('setImmediate');
  });
})

执行结果为setImmediate setTimeout。这是因为进入IO之后随之进入check阶段,然后才会进入下次事件循环中。

相关文章

  • 浅谈JavaScript事件循环与Vue的批量异步更新策略

    在介绍事件循环之前,首先要明确以下几个关键概念。事件循环,同步和异步任务,宏任务,微任务。 一.事件循环 事件循环...

  • 并发:事件循环 & asyncio

    1. 事件循环机制 1.1. 什么是事件循环 事件循环(Event Loop),即通过轮询方法监控事件; asyn...

  • 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环、更新循环以及渲染循环了。首先我们来区分一下事件循环和渲染循...

  • 事件循环

    先来一张图 下面上写的代码,在看浏览器的主线程的执行情况 再来上主线程页面初始化加载时的情况 setInterva...

  • 事件循环

    事件触发不会马上执行回调,会加入队列,队列中按照先进先出的顺序,逐个执行事件绑定的回调方法 新事件产生后会插在队尾...

  • 事件循环

    总结:第一次循环先执行宏任务中的队头任务,清空调用栈后执行微任务,然后第二次循环执行宏任务的队头任务,.........

  • 事件循环

    原文链接:https://zhuanlan.zhihu.com/p/26229293最近琢磨了好久的Javascr...

  • 事件循环

    单线程 .JavaScript是单线程javascript是单线程,无论后面加了什么标准,什么操作,都不能改变ja...

  • 事件循环。。

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 A...

  • 事件循环

网友评论

      本文标题:事件循环

      本文链接:https://www.haomeiwen.com/subject/riacmctx.html