JavaScript消息机制入门篇
JavaScript这个语言本身就是建立在一种消息机制上的,所以它很容易处理异步回调和各种事件。这个概念与普通的编程语言基础是不同的,所以让很多刚接触JavaScript的人摸不着头脑。JavaScript就是通过消息来实现多个事务同时处理,不要把自己吊死在一个消息中。
经常会看到这样的问题“JavaScript有sleep函数吗?”、“如何让上面的函数执行完后再执行下面的函数?”,就是因为没有理解消息机制才会发出这样的疑问。JavaScript是单线程的,要是有sleep函数,那在sleep的期间整个页面就停止渲染了,使用XHR同步请求一个大文件就会出现这种情况,所以在JavaScript中搞sleep是不科学的!JavaScript当然也是和其它编程语言一样,代码是从上到下运行的,上面的函数必须执行完了才执行下面的函数。我知道提问者遇到的问题是上面的函数中有异步回调,而下面的函数需要在异步回调结束后再运行,这就是没搞明白消息机制。
那么,消息是个啥?这篇是写给初学者的,我就不从线程的消息机制开始介绍了。简单的说吧,每一个消息都可以理解为一个代码片段,有很多消息被放在一个消息队列中,他们也是一个个顺序执行过来的,无法同时处理两个消息。这些消息中有很大一部分是系统消息,一般是用来处理页面渲染之类的。比如拖动滚动条时候会触发滚动条事件,同时页面也需要重绘,这些事件、重绘、都是消息。
我们当然也可以使用setTimeout之类的函数来往消息队列中添加自己的消息,有时候也称他们为计时器事件。setTimeout的功能就是把一个函数作为一个新的消息放入消息队列中。当然,也可以通过设置它的第二个参数来指定放入消息队列的延迟时间。而setInterval则是每隔一个设置的时间就把指定函数作为消息往消息队列中添加一次。消息添加到消息队列中并不是立即处理,因为消息队列中的消息也是一个个顺序处理的。比如这样一段代码setTimeout()return;
也许有人会很诧异,为什么事件绑定在send之后?应该是先添加事件然后再发送吧?其实XHR对象使用了其它线程,这里涉及到一点跨线程通信的问题,如果没兴趣可以跳过这一段。跨线程访问数据时需要使用委托,要不就会发生数据冲突,而所谓委托其实就是一个线程向另一个线程发送消息。这里执行了send后,即使服务器返回数据比我执行代码还快(一般也不可能),但是XHR线程要想触发主线程XHR对象的onreadystatechange事件就需要委托,而主线程目前是忙碌状态,它正在处理初始化消息。只有等到初始化消息处理完后才会轮到子线程的委托处理,而初始化消息处理完就意味着onreadystatechange被绑定上了,所以它永远比XHR线程传来的事件先执行。
alert(xhr.responseText);
};
alert("Ajax还没完成呢?");
代码是从上到下运行的,所以不存在什么上面的代码运行完后再运行后面的代码。但是这个Ajax的例子很容易让人有一种错觉,觉得是Ajax还没完成就执行到了最后的alert。实际上上面的代码已经完成了他们的工作,最后的alert之前有4个语句对不对?第一句创建一个XHR对象,第二句设置XHR请求的相关参数,第三句发送请求,第四句绑定事件。这些工作不是都完成了吗?没有完成不是上面的代码,而是整个Ajax的逻辑业务。如果想让整个逻辑业务处理完成后再执行最后的alert,应该找到整个逻辑业务的终止处,比如上面代码的另一处alert的地方。不仅是Ajax,很多逻辑业务都需要多个消息共同处理,比如setTimeout实现的动画效果。
JavaScript就是这样,本身是单线程的,通过消息来实现多个事务同时处理。不要把自己吊死在一个消息中。
原文链接:http://www.web-tinker.com/article/20294.html
JavaScript消息机制入门篇的更多相关文章
- handler消息机制入门
handler消息机制入门 为什么要用handle? 我们在网络上读取图片信息时,是不能把耗时操作放在主线程里面的,当我们在子线程中获取到了图片的消息的时候,我们就需要把这个数据传给主线程. 而直接使 ...
- JavaScript学习笔记 - 入门篇(2)- 常用互动方法
输出内容(document.write) document.write() 可用于直接向 HTML 输出流写内容.简单的说就是直接在网页中输出内容. 第一种:输出内容用""括起,直 ...
- RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)
一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 在项目启 ...
- Android消息机制入门
接着处理<Android 网络图片查看器>中出现的问题 使用添加子线程,修改原程序: package com.wuyudong.imagesviewer; import java.io.I ...
- 【pac4j】OAuth 认证机制 入门篇
1,pac4j是什么? pac4j是一个支持多种支持多种协议的身份认证的Java客户端. 2,pac4j的12种客户端认证机制:目前我只有用过第一和第八种. OAuth (1.0 & 2.0) ...
- [android] android消息机制入门
上一节,先把访问网络的部分放到一个子线程里面去执行,new Thread(){}.start(),new Thread直接使用匿名内部类来实现,重写run()方法,内部类访问外部的变量,这个变量应该定 ...
- 【JS】394- 简明 JavaScript 函数式编程-入门篇
转载自公众号"程序员成长指北" 写在开头 本文较长,总共分为三大部分:(对于函数式编程以及其优点有一定理解的童鞋,可以直接从 第二部分 开始阅读) 第一部分:首先会通过实际代码介绍 ...
- JavaScript学习笔记 - 入门篇(1)- 准备
为什么学习JavaScript 一.你知道,为什么JavaScript非常值得我们学习吗? 所有主流浏览器都支持JavaScript. 目前,全世界大部分网页都使用JavaScript. 它可以让网页 ...
- JavaScript学习笔记 - 入门篇(3)- DOM操作
认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...
随机推荐
- <!>表格语法
<table aling=left>...</table>表格位置,置左 <table aling=center>...</table>表格位置,置中 ...
- 转:Python的这几个技巧,简直屌爆了
经使用Python编程有多年了,即使今天我仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原则的适用.这些年来的经历让我学到了很多的小技巧和知识,大多数是通过阅读很流行的开源软件,如Django ...
- 补图BFS(hdu 5876)
题目大意: 给出一个图和起点S,求补图中S到其他点的最短距离. http://acm.hdu.edu.cn/showproblem.php?pid=5876 我自己的垃圾做法: 用线段树来维护dijk ...
- 【vijos】1447 开关灯泡(高精度+特殊的技巧)
https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇 ...
- hdu 5360 Hiking(优先队列+贪心)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5360 题意:beta有n个朋友,beta要邀请他的朋友go hiking,已知每一个朋友的理想人数[L, ...
- Java RSA加密以及验签
签名加密以及验签工具类: 一般秘钥分为3个key 1.自己生成的私钥, 2.通过私钥生成的公钥1 3.通过提交公钥1给某宝,获取的公钥2. RSA公钥加密算法简介 非对称加密算法.只有短的RSA钥匙才 ...
- 如何利用jQuery检查浏览器是否是IE6-8
$.support.leadingWhitespace是IE特有的属性,用来检查浏览器是否是IE6-8
- 【BZOJ2208】[Jsoi2010]连通数 DFS
[BZOJ2208][Jsoi2010]连通数 Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示 ...
- 160719、Spring + Dubbo + zookeeper (linux) 框架搭建
转载一篇博客,写得不错(至少我参考一下搭建成功了) 转载地址:http://my.oschina.net/wangt10/blog/522799 dubbo简介 节点角色说明: Provider: 暴 ...
- 解决jsp上传文件,重启tomcat后文件和文件夹自动删除
吼吼,我遇到的问题是这样的......我写了一个图片上传的方法,上传时,判断没有这个目录就自动建立一个.然后开始上传图片,能成功,能在服务器找到文件夹和相应的文件. 但是,重启项目,或者清理缓存之后, ...