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 TextArea动态显示剩余字符
Oct 22 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
火狐4、谷歌12不支持Jquery Validator的解决方法分享
Jun 20 Javascript
JavaScript中的面向对象介绍
Jun 30 Javascript
使用VS开发 Node.js指南
Jan 06 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
Aug 21 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 Javascript
详解Vue.js入门环境搭建
Mar 17 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
Sep 30 Javascript
使用node搭建自动发图文微博机器人的方法
Mar 22 Javascript
jquery实现上传文件进度条
Mar 26 jQuery
vue3使用vue-router的完整步骤记录
Jun 20 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数据库连接类~~做成一个分页类!
2006/11/25 PHP
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
把html页面的部分内容保存成新的html文件的jquery代码
2009/11/12 Javascript
jQuery中dequeue()方法用法实例
2014/12/29 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
python抓取网页中的图片示例
2014/02/28 Python
Python中利用sorted()函数排序的简单教程
2015/04/27 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
python实现画圆功能
2018/01/25 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
高三自我评价
2014/02/01 职场文书
春游踏青活动方案
2014/08/14 职场文书
2014年采购员工作总结
2014/11/18 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL