浏览器环境

以下两段代码是等价的。req对事件的回调设置,实际上就是当前主线程任务队列的任务。

    var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function (){};
req.onerror = function (){};
req.send(); //equal var req = new XMLHttpRequest();
req.open('GET', url);
req.send();
req.onload = function (){};
req.onerror = function (){};

setTimeout(fn,0):往消息队列尾部添加一条消息,指定主线程有空的时候(所有同步任务执行完),要尽快执行fn函数

对于事件循环应该这么理解:

  主线程中有一个(同步)任务队列,另一个地方又有一个消息队列。

  仅当任务队列为空时,主线程才会去检查消息队列,取消息,然后把对应的回调函数以一个任务的形式插入到主线程的任务队列中。

  当任务队列不为空时,主线程会不停地从任务队列中取出任务,执行。直到任务队列为空,这个过程称为一次事件循环

  事件循环实际上就是主线程【执行任务】和【取消息、插入任务】的过程,两部分不停循环

可见主线程所做的事情就是,执行任务、取消息、插入任务。那插入消息这个过程谁来做?

  这里引入一个概念叫做“工作线程”,主线程执行任务时,可能会开启异步任务(如ajax,timeout等),这时实际上就是通知一个工作线程去执行这个异步任务,执行完成后,这个工作线程就往消息队列中插入一个消息,表示通知主线程,你交给我的任务我已经搞定啦

根据以上的理解可以发现,消息和回调函数必定是一一对应的。看看这个例子

var getMsg = new Promise(function(resolve,reject){
console.log('begin...');
resolve('ok');
});
getMsg.then(function(data){
console.log(data);
});
console.log('last');

运行输出:

begin...
last
ok

对于promise,看起来像触发回调的时候,这个回调还没定义。但实际上不是这样的,promise内置的回调会执行,然后这个内置的回调会调用我们自定义的回调方法而已,也就是说我们定义的回调方法是间接被调用的

node环境

node的事件循环不属于v8引擎的一部分,它由libuv库提供

process.nextTick:往主线程的同步任务队列尾部添加一个任务,这意味着这个任务执行在所有回调函数之前

setImmediate:和setTimeout(fn,0)类似

可见:

  process.nextTick 和 setImmediate 相比,前者明显要高效与后者,因为前者运行在当前的事件循环中,不需要去检查消息队列

js event loop事件循环的更多相关文章

  1. node.js中对Event Loop事件循环的理解

    javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...

  2. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

    https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...

  3. Event Loop事件循环,GET!

    JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求.在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件 ...

  4. javascript的event loop事件循环

    javascript的event loop事件循环 这是今天一个朋友发给我的一个面试题, 感觉还挺有意思的, 写个博客以供分享 先看看这个面试题目: 观察下面的代码,写出输出结果 console.lo ...

  5. 浅谈 Event loop (事件循环)

    从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管 ...

  6. 进程,线程,Event Loop(事件循环),Web Worker

    线程,是程序执行流的最小单位.线程可与同属一个进程的其他线程共享所拥有的全部资源,同一进程中的多个线程之间可以并发执行.线程有就绪,阻塞,运行三种基本状态. 阮一峰大神针对进程和线程的类比,很是形象: ...

  7. JavaScript event loop事件循环 macrotask与microtask

    macrotask  姑且称为宏任务,在很多上下文也被简称为task.例如: setTimeout, setInterval, setImmediate, I/O, UI rendering. mic ...

  8. The Node.js Event Loop, Timers, and process.nextTick() Node.js事件循环,定时器和process.nextTick()

    个人翻译 原文:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ The Node.js Event Loop, Ti ...

  9. Node.js event loop 和 JS 浏览器环境下的事件循环的区别

    Node.js  event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...

随机推荐

  1. 黑客攻防技术宝典web实战篇:Web 应用程序技术习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. OPTIONS 方法有什么作用? OPTIONS 方法要求服务器报告可用于特定资源的 HT ...

  2. php 中的引用(&)与foreach结合后的一个注意点

    关于php中引用的概念及foreach循环的的应用就不多说了,php文档已经说的很明白了.直接上一段代码: <?php $arr = array(1,2, 3); foreach($arr as ...

  3. 如何为github已有仓库添加协议。

    在github创建开源项目的时候,github会引导开发者添加一个开源协议,直接照着操作即可.但是如果一开始没有添加开源协议,后面要怎么添加呢? 百度无果.多方打听.总结如下步骤. 1.首先,进入你的 ...

  4. CSS3向外扩散的圆

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  5. Caffe实战四(Caffe可视化方法)

    面对一堆文件,一行行的数据,确实很难理解深度学习相关的概念,好比训练的数据.构建的网络是怎样的?今天按照书中第16天的内容实践了一翻,终于看到了所谓的深度神经网络的模样.(参考:<深度学习 21 ...

  6. 优先队列 POJ 3253 Fence Repair

    题目传送门 题意:一块木板按照某个顺序切成a[1], a[2]...a[n]的长度,每次切都会加上该两段木板的长度,问选择什么顺序切能使得累加和最小 分析:网上说这是哈夫曼树.很容易想到先切掉最长的, ...

  7. h5-16-SVG 与 HTML5 的 canvas 各自特点

    1. Canvas是使用JavaScript程序绘图(动态生成),SVG是使用XML文档描述来绘图.2.SVG更适合用来做动态交互,而且SVG绘图很容易编辑,只需要增加或移除相应的元素就可以了.同时S ...

  8. qconshanghai2016

    http://2016.qconshanghai.com/schedule 大会日程 2016年10月20日 星期四 07:45 开始签到 09:00 开场致辞 专题 前端技术实践 主题演讲 业务上云 ...

  9. 释放资源的一般范式——更锋利的C#代码小记

    public class Photo : IDisposable { //在Finalize函数中调用内部的Dispose方法 ~Photo() { //被自动回收时仅释放托管资源,不释放非托管资源 ...

  10. 8.2.6 PEB —— PEB结构值不正确的问题

    书中作者使用 dt _PEB xxxxxx 命令来查看当前进程的PEB结构. 实际操作后PEB结构显示的成员值: 作为进程链表的LDR结构居然没有值,这显然是不正常的,地址也没有输错,问题到底出在哪里 ...