js event loop事件循环
浏览器环境
以下两段代码是等价的。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事件循环的更多相关文章
- node.js中对Event Loop事件循环的理解
javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...
- 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...
- Event Loop事件循环,GET!
JS中比较让人头疼的问题之一要算异步事件了,比如我们经常要等后台返回数据后进行dom操作,又比如我们要设置一个定时器完成特定的要求.在这些同步与异步事件里,异步事件肯定是在同步事件之后的,但是异步事件 ...
- javascript的event loop事件循环
javascript的event loop事件循环 这是今天一个朋友发给我的一个面试题, 感觉还挺有意思的, 写个博客以供分享 先看看这个面试题目: 观察下面的代码,写出输出结果 console.lo ...
- 浅谈 Event loop (事件循环)
从Event Loop谈JS的运行机制 先来理解一个概念: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 Execute Content Stack 主线程之外,事件触发线程管 ...
- 进程,线程,Event Loop(事件循环),Web Worker
线程,是程序执行流的最小单位.线程可与同属一个进程的其他线程共享所拥有的全部资源,同一进程中的多个线程之间可以并发执行.线程有就绪,阻塞,运行三种基本状态. 阮一峰大神针对进程和线程的类比,很是形象: ...
- JavaScript event loop事件循环 macrotask与microtask
macrotask 姑且称为宏任务,在很多上下文也被简称为task.例如: setTimeout, setInterval, setImmediate, I/O, UI rendering. mic ...
- 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 ...
- Node.js event loop 和 JS 浏览器环境下的事件循环的区别
Node.js event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...
随机推荐
- bzoj 2435: [Noi2011]道路修建【树形dp】
dp求size和deep,然后对每条边模拟求代价即可 #include<iostream> #include<cstdio> #include<algorithm> ...
- 洛谷 P2519 [HAOI2011]problem a
传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...
- iOS bounds vs frame
斯坦福iOS开发课程的白胡子大叔的PPT解释得淋漓尽致!
- Zernike矩之边缘检测(附源码)
这一篇博文将讨论Zernike矩在边缘检测中的应用,关于Zernike矩的基本概念,可以参看<Zernike矩之图像重建(附源码> 源码下载 参考: [4] Ghosal S, Mehro ...
- 529 Minesweeper 扫雷游戏
详见:https://leetcode.com/problems/minesweeper/description/ C++: class Solution { public: vector<ve ...
- 正则表达式test报错 is not a function
var reg = "/^1[34578]\d{9}$/"; //错误格式,这是一个字符串 var reg2 = /^1[34578]\d{9}$/; //正确格式 reg .te ...
- cmd命令下执行jar包程序
在cmd中使用指令来执行jar包 概述: 今天有一个需求,要在cmd中执行.jar文件 实践: 1.新建你的Hello world 2.导出到jar包 3.打开你的成功导出的jar包 4.打开文件夹 ...
- 【ADO.NET】 基础 (SQL Server)
一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...
- webpack采坑十连跳
4.css.js一同打包进html ---------------- https://www.cnblogs.com/amiezhang/p/9723565.html 依赖内联插件 HtmlWebp ...
- AJPFX总结线程创建的两种方法
创建线程的第一种方式:继承Thread ,由子类复写run方法.步骤:1,定义类继承Thread类:2,目的是复写run方法,将要让线程运行的代码都存储到run方法中:3,通过创建Thread类的子类 ...