JavaScript中EventLoop介绍


Posted in Javascript onJanuary 22, 2018

JavaScript中EventLoop介绍

想象下,比如浏览器在运行一个复杂的图像转换算法,因为是单线程的,所以此时浏览器进程被阻塞了,不能进行界面渲染,也不能运行其他代码,你的应用界面会失去和用户的交互。

这一般情况下还不会有大问题,但是当浏览器在同时运行多个类似的算法时,这个问题就很严重了。

有一定经验js开发人员大多都理解代码的异步执行,特别是ajax的使用。

// ajax(..) is some arbitrary Ajax function given by a library
var response = ajax('https://example.com/api');
console.log(response);
// `response` won't have the response

这里response 将不会得到你想要的结果。

而是需要像相面这样,通过 callback函数的方式,获取结果

ajax('https://example.com/api', function(response) {
  console.log(response); // `response` is now available
});

另外这里面提醒一下,下面的代码, async: false永远都不是一个好主意。

// This is assuming that you're using jQuery
jQuery.ajax({
  url: 'https://api.example.com/endpoint',
  success: function(response) {
    // This is your callback.
  },
  async: false // And this is a terrible idea
});

通过上面的例子,我们应该理解通过 异步 函数,可以帮助我们解决 类似浏览器阻塞问题。

当然还可以通过 setTimeout(callback, milliseconds)实现同样的逻辑。如果你理解了异步,下面代码执行会输出什么呢?

function first() {
  console.log('first');
}
function second() {
  console.log('second');
}
function third() {
  console.log('third');
}
first();
setTimeout(second, 1000); // Invoke `second` after 1000ms
third();

那个这下异步处理机制的原理是什么呢?这里就要引入我们的事件循环Event Loop了

JavaScript中EventLoop介绍

Event Loop有一个简单的Job(task) - 监视Call Stack和Callback Queue。如果调用堆栈为空,它将从队列中取出第一个事件,并将其推送到调用堆栈,从而有效地运行它。

这种迭代在事件循环中被称为Tick。每个事件只是一个函数回调。

console.log('Hi');
setTimeout(function cb1() { 
  console.log('cb1');
}, 5000);
console.log('Bye');

执行这段代码,下面的调用栈清楚的演示了事件循环的处理流程。

JavaScript中EventLoop介绍

请注意,setTimeout(...)不会自动将您的回调放在事件循环队列中。

它设置了一个计时器。当计时器到期时,浏览器将你的回调放到事件循环中,以便将来的一些tick会执行。但是,队列中可能还有其他事件已经被添加了 - 您的回调将不会立即执行。

有很多关于开始使用JavaScript中的异步代码的文章和教程,建议您使用setTimeout(callback,0)。
现在你知道Event Loop是怎么做的,以及setTimeout是如何工作的。

你就能更好的理解下面的代码

console.log('Hi');
setTimeout(function() {
  console.log('callback');
}, 0);
console.log('Bye');

尽管等待时间设置为0 ms,但浏览器控制台中的结果如下所示:

Hi

Bye

callback

Javascript 相关文章推荐
JS获取浏览器版本及名称实现函数
Apr 02 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
Jan 06 Javascript
Node.js开发之访问Redis数据库教程
Jan 14 Javascript
AngularJS入门教程之更多模板详解
Aug 19 Javascript
深入理解JavaScript定时机制
Oct 27 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
Mar 13 Javascript
微信小程序多列选择器range-key使用详解
Mar 30 Javascript
实战node静态文件服务器的示例代码
Mar 08 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
Feb 21 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
Aug 20 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
Apr 08 Javascript
vue制作toast组件npm包示例代码
Oct 29 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
Jan 22 #Javascript
基于vue2.x的电商图片放大镜插件的使用
Jan 22 #Javascript
vue 项目常用加载器及配置详解
Jan 22 #Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
Jan 22 #Javascript
jquery+ajaxform+springboot控件实现数据更新功能
Jan 22 #jQuery
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 #jQuery
angular写一个列表的选择全选交互组件的示例
Jan 22 #Javascript
You might like
php代码把全角数字转为半角数字
2007/12/10 PHP
php实现简单文件下载的方法
2015/01/30 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
python实现图像全景拼接
2020/03/27 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
Footshop法国:购买运动鞋
2020/01/19 全球购物
司机职责范本
2014/03/08 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
鼓舞士气的口号
2014/06/16 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
Python极值整数的边界探讨分析
2021/09/15 Python
源码安装apache脚本部署过程详解
2022/09/23 Servers