浏览器环境

以下两段代码是等价的。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 相比,前者明显要高效与后者,因为前者运行在当前的事件循环中,不需要去检查消息队列

最新文章

  1. ubuntu下安装mysql, eclipse, tomcat
  2. 【转】Windows Phone 8 开发环境的搭建
  3. SpringMVC简单构造restful, 并返回json
  4. Spark(三): 安装与配置
  5. Log4J配置文件说明
  6. SQLite 入门教程(一)基本控制台(终端)命令 (转)
  7. 寻找链表中倒数第K个结点的位置
  8. php 中的$argv与$argc
  9. 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器
  10. 0ctf-pwn_warmup-re_mips4
  11. STL之容器适配器queue的实现框架
  12. JAVA基础---面向对象
  13. 201521123003《Java程序设计》第8周学习总结
  14. Python之uuid模块
  15. 虚拟机搭建Zookeeper服务器集群完整笔记
  16. Cocos Creator 资源加载流程剖析【二】——Download部分
  17. Unity TimeLine 资源结构
  18. shiro教程2(自定义Realm)
  19. SQL 中的多条件查询
  20. poj-2142-exgcd/解的和最小

热门文章

  1. bzoj 2023: [Usaco2005 Nov]Ant Counting 数蚂蚁【生成函数||dp】
  2. UITableViewCell添加点击时改变字体的颜色、背景、图标
  3. NowCoder数列
  4. UltraEdit - 怎么显示文件标签栏和侧边栏
  5. Centos 内存释放
  6. C++ typedef typename 作用
  7. 跟我一起玩Win32开发(10):绘图(C)
  8. 18.3.2从Class上获取信息(方法)
  9. 谷歌编码风格内容,新建一个xml文件,复制进去就可以在eclipse里面用了,命名--eclipse-java-google-style.xml
  10. [转]在WIN7下安装运行mongodb