浏览器环境

以下两段代码是等价的。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. Electron开发

    [Debug] 1)cmd进入项目所在根目录,输入: $ npm install --save-dev devtron$ npm install --save electron-debug 2)在主j ...

  2. robotframework自动化系列:文本类型的下拉框

    对于下拉框定位和输入,这里主要遇到有两种类型的下拉选择. 其中一个类型是select-options格式,如图 这种方式的定位可以使用select from list by value或select ...

  3. Luogu P1463 [POI2002][HAOI2007]反素数【数论/dfs】By cellur925

    题目传送门 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1 ...

  4. Backbone.js入门教程第二版笔记(3)

    视图渲染 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  5. session共享方法

    session数据保存在memcached,redis这种内存数据库内 memcache比较简单,使用的场景比较多.redis支持的数据类型多.而且数据具有期限,和session和期限可以配合使用 通 ...

  6. redis本地安装与开发

    一.安装(MAC) https://redis.io sudo mv redis-4.0.11.tar.gz /usr/localcd /usr/localsudo tar -zxf redis-4. ...

  7. [转]合理使用ArrayMap代替HashMap

    合理使用ArrayMap代替HashMap 2016年07月08日 15:34:44 阅读数:5938 转载请标注: 披萨大叔的博客 http://blog.csdn.net/qq_27258799/ ...

  8. LOJ#121. 「离线可过」动态图连通性(线段树分治)

    题意 板子题,题意很清楚吧.. Sol 很显然可以直接上LCT.. 但是这题允许离线,于是就有了一个非常巧妙的离线的做法,好像叫什么线段树分治?? 此题中每条边出现的位置都可以看做是一段区间. 我们用 ...

  9. 安装scount的es驱动,composer require tamayo/laravel-scout-elastic报错解决

    执行 composer require tamayo/laravel-scout-elastic 报错信息如下: Problem 1 - Installation request for tamayo ...

  10. Long time no blogging

    It is a long time before I posted the last blog on myspace and seems that all of my blogs/documents ...