Javascript Event Loop是什么

Javascript执行的时候是单线程的,所以一些耗时的操作需要启用其它的线程去处理,这样才不会阻塞整个线程的执行,这种任务我们称为异步任务。

然后这些异步任务需要由 浏览器或者NodeJS 轮询的去检查是否有任务完成,需要去处理。每一次检查称为一个tick。这一整个流程就叫做 event loop。

 

Javascript Event Loop分

Event Loop分为两大类:微任务宏任务 。同一个tick中微任务会在宏任务之前执行。

微任务:简单理解就是某些操作需要放到同步执行js的结尾执行。类似于一个函数执行完了,然后最后执行一个结束的钩子函数。包括:Promise.then、Promise.catch、new MutationObserver、process.nextTick、

宏任务:简单理解就是一些需要启动别的线程的操作,放到了一个任务队列中。每次tick都会去这里检查有没有任务需要处理。包括:setTimeout、setInterval、IO、setImmediate等

 

浏览器与NodeJS Event Loop的差异

浏览器只是同步js结束之后,统一检查所有的异步任务。微任务在宏任务之前执行,不同的宏任务之间没有明确的先后顺序。

NodeJS比浏览器在 Event Loop上面多了一些不同的阶段,不同的宏任务多了先后顺序。

NodeJS顺序:

1、timers 阶段。主要执行setTimeout、setInterval 定时器的回调任务

2、pending callbacks阶段。主要是某些系统操作的回调。

3、poll阶段。 轮循等待新的链接和请求等事件

4、check 阶段。setImmediate回调

5、close callbacks。关闭回调执行

 

nextTick、setImmediate、setTimeout区别

这几个比较迷惑。

nextTick类似于promise.then,就是同步任务执行完第一个执行nextTick,比如其它的异步任务都早

setImmediate 在第四个阶段,比如setTimeout(() => {}, 0)晚。

setTimeout 在第一个阶段,比如异步的io检查要早

setTimeout(() => {
  console.log("setTimeout 1");
}, 0);
process.nextTick(() => {
  console.log("process.nextTick 1");
});
setImmediate(() => {
  console.log("setImmediate 1");
});

Promise.resolve().then(() => {
  console.error("process.then 1");
});
process.nextTick(() => {
  console.log("process.nextTick2");
});
setTimeout(() => {
  console.log("setTimeout 2");
});
Promise.resolve().then(() => {
  console.error("process.then 2");
});
setImmediate(() => {
  console.log("setImmediate 2");
});

执行结果:

 

 说明nextTick比如Promise.then还要更早的执行

原文地址:http://www.cnblogs.com/hellolol/p/16911791.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性