博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript Event Loop 浅析
阅读量:7082 次
发布时间:2019-06-28

本文共 1304 字,大约阅读时间需要 4 分钟。

最近在学习Nodejs的过程中深入的了解了异步编程这个概念,为了更好的使用Nodejs,这些概念不可不知。在以前作为一个JavaScript用户的时候,完全是不知道它是怎么运行的,对好些概念也是“知其然不知其所以然”。

对于客户端的JavaScriptNodejs来说其实差距不是很大,这回就从客户端方面来说说Event Loop这个概念吧,算是异步编程的一个切入点吧。其实jQuery的作者John Resig在几年前就写了一篇好文章,来讲述timer事件在浏览器中是怎样工作的,我也是通过这篇文章才“知其所以然”。

问题场景

先来看看一段代码:

123456789101112131415161718192021
do something  

上面代码主要想完成一个功能:按钮被点击时------>显示一个状态告知用户正在干一些事情------>开始干------>事情干完后状态变更为已完成。

看上去没问题,应该是可以工作的,于是在浏览器运行这个页面。可是现实总是残忍的,没有符合预期效果。当点击按钮之后,浏览器就冻结了,用于显示状态的div并没有显示,界面上也没有“doing...”这个提示;经过10s之后,浏览器回过神了,代表耗时较长的计算已经结束,此时用于显示状态的div显示“done”。

究其原因:JavaScript引擎是单线程的。而此时还有必要再了解下浏览器内核都有哪些主要的常驻线程,才能解上面的疑惑。浏览器内核常驻线程大致包含以下:

  1. 浏览器GUI渲染线程
  2. JavaScript引擎线程
  3. 浏览器定时触发器线程
  4. 浏览器事件触发线程
  5. 浏览器http异步请求线程

而GUI渲染线程和JavaScript引擎线程是互斥的,JavaScript执行时GUI渲染线程是挂起的,页面将停止一切的解析和渲染行为。上面的3、4、5类线程也会产生不同的异步事件。看下面这张图就应该比较直观了。

JavaScript-Event-Loop

因为JavaScript引擎是单线程的,所以代码都是先压到队列,然后由引擎采用先进先出的方式运行。事件处理函数、timer执行函数也会排到这个队列中,然后利用一个无穷回圈,不断从队头取出函数执行,这个就是Event Loop

接下来还是继续用图来说明上面的代码为什么没有达到预期效果。

于是结果就只看到了"done"。

怎样解决?

使用setTimeout(),下面是修改后的onclick事件处理函数:

12345678910
doBtn.onclick = function(e) {  e.preventDefault();  status.innerText = 'doing...please wait...';  //开始啦    setTimeout(function() {    sleep(10000);  //模拟一个耗时较长的计算过程,10s    status.innerText = 'done';  //完成啦  }, 0);  // 0ms delay};

为什么这样就解决了呢?还是用上面的队列的图来解释。

转载地址:http://twlml.baihongyu.com/

你可能感兴趣的文章
开放式智能感知平台xPerception:解决AI和人类、虚拟与现实之间的“最后一公里”...
查看>>
东南大学高桓:知识图谱表示学习 | 直播预告·PhD Talk #15
查看>>
Java ThreadLocal 使用详解
查看>>
CentOS下安装JDK的三种方法
查看>>
Facebook人工智能负责人:我们可以教机器学习常识
查看>>
软件定义存储之后,下一步考虑的是什么?
查看>>
C++ 之父 Stroustrup 推出“ C++ 核心准则”
查看>>
DXC帮助全球企业和公共领域客户拥抱变革
查看>>
中国式互联网繁荣,华丽但爬满虱子的创业袍
查看>>
联想S9:遥控器值得点赞,但是莫轻言“终结”
查看>>
管理虚拟化数据中心的新方向
查看>>
芯盾时代: 开启“智慧身份认证”新时代
查看>>
2017年最流行的15个数据科学Python库
查看>>
诸葛io围绕用户的场景化分析 驱动数据价值释放
查看>>
看德国能源转型中的光伏如何破茧成蝶
查看>>
实时语音“小社交”可能吗?多元化应用之中华通
查看>>
华为将设研发机构在日本“进军物联网”
查看>>
青海首试100%清洁能源供电 暂不具备常态化推广条件
查看>>
Incorporating Copying Mechanism in Sequence-to-Sequence Learning
查看>>
中国网民近一年因垃圾诈骗信息等遭受经济损失915亿
查看>>