写js写傻了,明天研究一下异步
在html某元素上绑定一个click事件,该事件是一个执行事件很长的函数,比如执行几十亿或几百亿次加法,那么在这个函数执行的过程中,其他元素绑定的事件,是如何触发的呢,异步触发还是同步,触发时是怎么执行的呢,也是同步执行下来的么?明天好好研究一下。
目前找到一篇不错的博文,今晚看不完了,明天接着研究及该文章其参考的文章 文章2
通过以上文章,已经对js引擎的单线程以及浏览器内核的多线程机制了解了一番,那么对于jquery的延迟对象以及ES6的promise的异步又是怎样实现的呢。目前自己的结论是,promise是通过代码组织方式实现异步的,但仍要服于js单线程以及浏览器多线程的机制。看下面的代码
<body>
<div class="app">gagggg</div>
<div class="app2" >cccccc</div>
<script>
var defer = $.Deferred();
defer.done(function(){ alert("OK OK OK"); }) $(function () {
$('.app').click(function () {
var a = 0;
for (var i = 0; i < 5000000000; i++) {
a = a + i + 1;
}
$('.app').addClass('red');
console.log('app1'); });
$('.app2').click(function () {
defer.resolve();
});
})
</script>
</body>
.app绑定的事件在我本机上大概要6秒左右的样子执行完,在.app刚被触发的时候,立马点击.app2,发现defer.done并没有执行,也就是说defer.resolve没有触发,因为resolve在click事件内部,而事件是浏览器的事件引擎来处理的,事件发生时,事件引擎将事件处理函数放到js引擎队列的最后 ,所以resolve仍要等待js队列执行到这儿才能触发。
那jquery的延迟对象究竟是什么东西呢。上面已经说了自己目前的结论,是代码的一直组织方式。类似与回调函数,defer.resolve()可以看成是一函数的执行,该函数执行到最后,会调用defer.done(function(){ })里的匿名函数,更精确的讲,是回调机制的另一种组织方式。自己写个大概的deferred的实现流程吧,不是很准确。
var defer = $.Deferred();
var fun1 = function () {};
defer.done(fun1);
defer.resolve();
resolve将done里的函数放在了自己的执行队列里,不过resolve自身的被调用仍受制于js单线程以及浏览器多线程的机制。
写到这儿,好想去jquery源码去研究一下延迟对象是怎样写出来的。先等等,等我能熟练用webpack+bable+es6+vue全家桶+sass+compass构建出一个vue2.0工程。
写js写傻了,明天研究一下异步的更多相关文章
- 新手教程:不写JS,在MIP页中实现异步加载数据
从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...
- 不管你以后写不写JS,都应该学会这种思考方式
昨天在网上看到了一篇文章说程序员写不过35这种说法,但事实上,确实并不能每个人都像我一样,在写JS中找到乐趣,就乐意写这东西直到50岁眼瞎为止. 那肯定有人要问,也许我不仅写JS写不到35,可能我连3 ...
- 去它的h5,我还是用js写原生跨平台app吧
智能手机功能越来越强大,已经在逐渐替代电脑的作用.百度.腾讯.阿里的移动端日活数也在逐步的赶上甚至超越电脑端用户.叫喊着“mobile first”的公司越来越多,App开发者应运而生,且队伍日趋庞大 ...
- 前端与编译原理——用JS写一个JS解释器
说起编译原理,印象往往只停留在本科时那些枯燥的课程和晦涩的概念.作为前端开发者,编译原理似乎离我们很远,对它的理解很可能仅仅局限于"抽象语法树(AST)".但这仅仅是个开头而已.编 ...
- 用原生js写一个"多动症"的简历
用原生js写一个"多动症"的简历 预览地址源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js来实现. 会动的简历实现 ...
- Node.js写文件的三种方法
Node.js写文件的三种方式: 1.通过管道流写文件 采用管道传输二进制流,可以实现自动管理流,可写流不必当心可读流流的过快而崩溃,适合大小文件传输(推荐) var readStream = fs. ...
- 用JS写了一个打字游戏,反正我是通不了关
今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度: getRandom函数会返回一个字符对象, 这个对象包含了 ...
- JS写小游戏(一):游戏框架
前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 ...
- 如何在一个网站或者页面写js
如何在一个网站或者页面写js: 1. JS的分层(功能):jquery(tools) 组件(ui) 应用(app).mvc(backboneJS) 2. JS的规划(管理):避免全局变量和方法(命 ...
随机推荐
- 流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
RTP 参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细 ...
- SVN服务器的配置(简单易懂,带配置文件,有注释)
这两天在服务器搭建了一个SVN服务器,一些经验,也留作后用把,有不详细的欢迎批评指正 另外关于子目录的访问配置,这块我还是不懂,希望有前辈能教我一下 1.安装SVN Serveryum install ...
- Tomcat的优化
Tomcat的优化配置 修改tomcat的config目录下server.xml文件 <Connector port="9021" protocol="HTTP/ ...
- ES6详解
1.ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const声明常亮,不可改变 2.变量的解构赋值 (1)数组的解构赋值: 以前,为 ...
- 五步搞定Android开发环境部署
引言 在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入 Android浪潮的朋友们,为了确保大家能顺利完成开发 ...
- linux中shell变量$#,$@,$0,$1,$2的含义解释(转)
变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 ...
- REST,RESTful
REST(Representational State Transfer)描述了一个架构样式的网络系统. RESTful架构,就是目前最流行的一种互联网软件架构.结构清晰.符合标准.易于理解.扩展方便 ...
- Sublime+Golang Plugin
很喜欢在Sublime开发Golang程序,主要是要一个Sublime Golang Plugin, 可以给代码autocomplement.相当的棒! 1.安装Sublime https://www ...
- linux bash中too many arguments问题的解决方法
今天在编写shell脚本时,在if条件后跟的是[ $pid ],执行脚本的时候报 然后我输入改为[[$pid]]后,再执行脚本,就成功了,代码如下: #!/bin/bash pid=`ps -ef|g ...
- JSP中<base href="<%=basePath%>">作用
通常在JSP页面开通有如下代码: <% String path = request.getContextPath(); String basePath = request.getScheme() ...