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 event事件的传递与冒泡处理
Dec 06 Javascript
jQuery EasyUI 中文API Button使用实例
Apr 14 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
Oct 17 Javascript
JS实现从连接中获取youtube的key实例
Jul 02 Javascript
jquery实现简单的轮换出现效果实例
Jul 23 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 jQuery
js中apply和Math.max()函数的问题及区别介绍
Mar 27 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
Sep 27 Javascript
JS出现404错误原理及解决方案
Jul 01 Javascript
详解Vue3 Teleport 的实践及原理
Dec 02 Vue.js
浅谈JS的二进制家族
May 09 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多线程编程之管道通信实例分析
2015/03/07 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
Jquery cookie操作代码
2010/03/14 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
微信小程序表单弹窗实例
2018/07/19 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
javascript设计模式 ? 中介者模式原理与用法实例分析
2020/04/20 Javascript
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
python处理Excel xlrd的简单使用
2017/09/12 Python
python更改已存在excel文件的方法
2018/05/03 Python
对Python 数组的切片操作详解
2018/07/02 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
python实现代码统计程序
2019/09/19 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
css3实现动画的三种方式
2020/08/24 HTML / CSS
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
审核会计岗位职责
2013/11/08 职场文书
应届中专生自荐书范文
2014/02/13 职场文书
市级文明单位申报材料
2014/05/07 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
劳资员岗位职责
2015/02/13 职场文书
2016年春节问候语
2015/11/11 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
python调试工具Birdseye的使用教程
2021/05/25 Python