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 相关文章推荐
JavaScript中Object和Function的关系小结
Sep 26 Javascript
JQuery 图片滚动轮播示例代码
Mar 24 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
JavaScript制作颜色反转小游戏
Sep 25 Javascript
JS 对java返回的json格式的数据处理方法
Dec 05 Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 Javascript
VUE+node(express)实现前后端分离
Oct 13 Javascript
JS中比较两个Object数组是否相等方法实例
Nov 11 Javascript
JS简单表单验证功能完整示例
Jan 26 Javascript
vue postcss-px2rem 自适应布局
May 15 Vue.js
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 分页原理详解
2009/08/21 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
php结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
200行python代码实现2048游戏
2019/07/17 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
pytorch的batch normalize使用详解
2020/01/15 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
python实现视频压缩功能
2020/12/18 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
Html5 FileReader实现即时上传图片功能实例代码
2014/09/01 HTML / CSS
专科生就业求职信
2014/06/22 职场文书
安全责任书范文
2014/08/25 职场文书
技术经济专业求职信
2014/09/03 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书