美文网首页
事件循环 浏览器vsNode

事件循环 浏览器vsNode

作者: 一只重拾梦想的小水 | 来源:发表于2019-06-06 12:28 被阅读0次

笔试题参考:
画出各个queue,执行时依次丢进去,按步骤执行、输出

浏览器:

  • 宏任务(macroTask):script 中代码、setTimeout、setInterval、I/O、UI render;
  • 微任务(microTask): Promise、Object.observe、MutationObserver。

(promise本身是同步的,then才是micro)

while (true) {
  宏任务队列.shift()
  微任务队列全部任务()
}

Node:

process.nextTick、microTask

  • timer: setTimeout、setInterval
  • I/O: fr.readFileSync
  • check: setImmediate
  • close: 不常用
    (其他不常用的本文忽略)
  1. 循环之前
    在进入第一次循环之前,会先进行如下操作:
  • 同步任务
  • 发出异步请求
  • 规划定时器生效的时间
  • 执行process.nextTick()
  1. 开始循环:
while (true) {
  loop.forEach((阶段) => {
    阶段全部任务()
    nextTick全部任务()
    microTask全部任务()
  })
  loop = loop.next
}

小练习:

function sleep(time) {
  let startTime = new Date();
  while (new Date() - startTime < time) {}
  console.log("1s over");
}
setTimeout(() => {
  console.log("setTimeout - 1");
  setTimeout(() => {
    console.log("setTimeout - 1 - 1");
    sleep(1000);
  });
  new Promise(resolve => resolve()).then(() => {
    console.log("setTimeout - 1 - then");
    new Promise(resolve => resolve()).then(() => {
      console.log("setTimeout - 1 - then - then");
    });
  });
  sleep(1000);
});

setTimeout(() => {
  console.log("setTimeout - 2");
  setTimeout(() => {
    console.log("setTimeout - 2 - 1");
    sleep(1000);
  });
  new Promise(resolve => resolve()).then(() => {
    console.log("setTimeout - 2 - then");
    new Promise(resolve => resolve()).then(() => {
      console.log("setTimeout - 2 - then - then");
    });
  });
  sleep(1000);
});

参考
https://segmentfault.com/a/1190000013660033?utm_source=channel-hottest

相关文章

  • 事件循环 浏览器vsNode

    笔试题参考:画出各个queue,执行时依次丢进去,按步骤执行、输出 浏览器: 宏任务(macroTask):scr...

  • 浏览器和Node事件循环的区别

    事件循环,是 js 中老生常谈的一个话题了,而在浏览器和 Node 中的事件循环执行机制也不相同,浏览器的事件循环...

  • 聊一聊浏览器事件循环与前端性能

    在网上也看了不少关于javascript事件循环的文章,多数是以浏览器事件循环与nodejs中事件循环做对比,分析...

  • EventLoop

    1.浏览器中的事件循环(Event Loop) 事件循环可以简单的描述为以下四个步骤 浏览器中的任务源(task)...

  • macrotask与microtask

    浏览器环境 注意点 首先, 一个浏览器环境,只能有一个事件循环 event loops 而一个事件循环可以多个任务...

  • JavaScript事件循环

    事件循环是什么?事实上我把事件循环理解成我们编写的JavaScript和浏览器或者Node之间的一个桥梁。 浏览器...

  • 回调函数

    浏览器的事件轮询 首先js是单线程的,js异步是浏览器事件轮询的结果。事件轮询的字面意思就是事件循环。事件轮询的步...

  • Nodejs事件循环机制(一)浏览器事件循环机制

    前言 事件循环可以理解为我们编写的js代码与浏览器或者node之间的一个桥梁 浏览器的事件循环是我们编写的js代码...

  • 再看浏览器事件循环和NodeJS事件循环

    事件循环是浏览器和Node用来解决JS单线程运行带来的问题的一种运行机制。浏览器和NodeJS环境下的事件循环是不...

  • 关于 JavaScript 事件循环 Event Loop 的一

    浏览器 JavaScript 执行流程以及在 Node.js 中都是基于事件循环的。 了解事件循环的工作原理对于正...

网友评论

      本文标题:事件循环 浏览器vsNode

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