JS单线程之eventloop

EventLoop是什么?

前言: eventloop即事件循环,是指浏览器或Node的一种解决JAVASCRIPT单线程运行时不会堵塞的一种机制,也就是我们经常使用异步的原理。

简短:异步解决方案。

浏览器的实现:根据html5规范明确定义。

node的实现:libuv实现(恐龙头像)–thread pool (关键)

google和node都是用v8引擎,但是处理不一样。

EventLoop是一个执行模式,在不同的地方有不同的实现,浏览器和node.js基于不同的技术实现了各自的EventLoop。


宏任务,macrotask,也叫tasks。一些异步任务的回调会依次进入macro task queue,等待后续被调用,这些异步任务包括:
setTimeout
setInterval
setImmediate(Node独有)
requestAnimationFrame(浏览器独有)
I/O
UI rendering(浏览器独有)

微任务,microtask,也叫jobs.另一些异步任务的回调会依次进入micro task queue,等待后续被调用,这些异步任务包括:
process.nextTick(Node独有)
Promise.then()
Object.observe
MutationObserve
(注:这里只针对浏览器和NodeJS)

node的执行 6个阶段 6个异步任务队列循环 分宏任务和微任务 nextTick then

timer(计时器)
执行setTimeout以及
setInterval的回调

I/O callbacks
处理网络、流、tcp的错误(http.get)
callback

idle prepares
node内部使用

poll(轮询) <---- incoming:
执行poll中的i/o队列 connections,
检查定时器是否到时 data, etc.

check
处理setImmediate的回调

close callbacks
关闭的回调例如
socket.on(‘close’)

1、先执行全局Script同步代码
2、执行微任务,先执行next tick queue中所有的任务,再执行othter microtask queue中的所有任务
3、开始执行宏任务,共6个阶段,等六个阶段都执行完在回到步骤2。

浏览器的执行
一个函数执行栈、一个事件队列(一次拿一个 等所有微任务执行完 再去拿宏任务)和一个微任务队列(连着连着调 一次取所有)
undefined(一轮事件循环的执行完毕 后面的异步任务都是在第二轮的事件循环执行的)
执行栈(foo() query() hello())-> Web Api(异步任务) -> 任务队列(放的是宏任务–onclick、 onload,表示执行所有微任务,再取执行宏任务) -> 事件循环

在浏览器里面:
每从事件队列中取一个事件时,有微任务的话,一定先把所有的微任务执行完,然后才开始从任务队列中执行事件。
执行所有微任务->一个宏任务->执行所有微任务->一个宏任务->。。。。

在浏览器端,所有的宏任务都在同一个任务队列执行

在node端,宏任务分为六个任务队列
执行所有微任务->所有的宏任务(6个阶段)->所有的微任务->所有的宏任务(6个阶段)。。。

js的主线程是单线程。。。

setTimeout有一个取值范围

注: 以上的node环境是node10以下版本,node11版本开始,与浏览器的机制差不多。。。。。无语。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值