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 相关文章推荐
基于jquery的自定义鼠标提示效果 jquery.toolTip
Nov 14 Javascript
JQuery扩展插件Validate—6 radio、checkbox、select的验证
Sep 05 Javascript
javascript模拟实现ajax加载框实例
Oct 15 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
jQuery控制div实现随滚动条滚动效果
Jun 07 Javascript
jQuery中的ready函数与window.onload谁先执行
Jun 21 Javascript
JQuery对ASP.NET MVC数据进行更新删除
Jul 13 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
Feb 14 Javascript
vue+element表格导出为Excel文件
Sep 26 Javascript
使用uni-app开发微信小程序的实现
Dec 13 Javascript
JS中准确判断变量类型的方法
Jun 01 Javascript
vue3.0 加载json的方法(非ajax)
Oct 26 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命名空间(Namespace)简明教程
2014/06/11 PHP
PHP多个文件上传到服务器实例
2014/10/29 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
基于Jquery的简单图片切换效果
2011/01/06 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
JavaScript中的Math 使用介绍
2014/04/21 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
python三元运算符实现方法
2013/12/17 Python
python获取多线程及子线程的返回值
2017/11/15 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
python如何实现视频转代码视频
2019/06/17 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
关于box-sizing的全面理解
2016/07/28 HTML / CSS
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
座谈会主持词
2014/03/20 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
2014年实习期工作总结
2014/11/27 职场文书
廉洁自律个人总结
2015/02/14 职场文书
格林童话读书笔记
2015/06/30 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python