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 相关文章推荐
JSON辅助格式化处理方法
Mar 26 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
angular directive的简单使用总结
May 24 Javascript
vue 指令之气泡提示效果的实现代码
Oct 18 Javascript
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
解决layer 动态加载select 失效的问题
Sep 18 Javascript
Vue3 源码导读(推荐)
Oct 14 Javascript
JavaScript React如何修改默认端口号方法详解
Jul 28 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
Sep 10 Javascript
vant中的toast层级改变操作
Nov 04 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 Javascript
JavaScript实现复选框全选功能
Apr 11 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 特殊字符处理函数
2008/09/05 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
windows下配置php5.5开发环境及开发扩展
2014/12/25 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
深入探讨javascript函数式编程
2015/10/11 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
vue内置指令详解
2018/04/03 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
Python中获取对象信息的方法
2015/04/27 Python
浅析Python中的for 循环
2016/06/09 Python
Django中Forms的使用代码解析
2018/02/10 Python
python生成n个元素的全组合方法
2018/11/13 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
解决Python内层for循环如何break出外层的循环的问题
2019/06/24 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
Windows和Linux动态库应用异同
2016/07/28 面试题
往来会计岗位职责
2013/12/19 职场文书
自荐书模板
2013/12/19 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
优秀党员申报材料
2014/12/18 职场文书
学校学期工作总结
2015/08/13 职场文书
高中运动会广播稿
2015/08/19 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电