jQuery ajax时间差导致的变量赋值问题分析


Posted in Javascript onJanuary 22, 2016

本文实例分析了jQuery ajax时间差导致的变量赋值问题。分享给大家供大家参考,具体如下:

ajax异步请求,在各种特效方面,做出了不少的贡献,有了它让用户体验更好。下面说一下曾今遇到过的一个问题,今天又遇到了,又花了我一点时间,小问题,但是特别容易忽视,并且不容易想到是什么原因产生的。废话不多说,举个例子大家就明白了。

一、准备测试文件test.php和test.html

1. test.php

<?php
echo "1";
?>

2. test.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
</head>
<body>
<div>3water.com</div>
</body>
</html>
<script type="text/javascript">
//js代码放到这里
</script>

二、问题举例

<script type="text/javascript">
function test(value){ //定义一个function
 error = false; //定义一个测试变量
 $.ajax({ //ajax异步请求
 type: "POST", //传值方式post
 url: "test.php", //异步请求的文件
 data: "name="+value, //异步请求的参数
 success: function(msg){ //请求成功的回调函数
 if($.trim(msg) == '1'){
 error = true; //返回值为1,把error变成true
 }
 }
 });
 alert(error); //打印一下error的内容,在这里你知道它会弹出什么吗?
 if(error == true){
 $("div").remove();
 }
}
test("good");
</script>

代码中的alert(error);不管msg返回什么,都只会弹出false,按javascript的执行原理,一般情况下都是顺序执行的,那为什么这个error的值没有被改变呢?原因就在于异步请求是有一个时间差的,为了验证这个时间差,在举个例子,可以让你清楚的看到,这个时间差。

三、验证ajax异步请求的时间差

<script type="text/javascript">
function test(value){
 error = false;
 $.ajax({
 type: "POST",
 url: "test.php",
 data: "name="+value,
 success: function(msg){
 if($.trim(msg) == '1'){
 error = true;
 alert(error); //在这里打印一下error
 }
 }
 });
 alert(error); //在这里打印一下error
 if(error == true){
 $("div").remove();
 }
}
test("good");
</script>

当你刷新页面后,问题就很清楚,它首先弹出的是false,然后弹出了true,二次弹出之间的时间差,就是ajax异步请求的时间差。从表面上看,这段js代码的执行顺序是这样的上--下--中,其实不是这样的,代码执行的顺序还是上--中--下。为什么会先执行下面的代码呢?那是因为ajax异步请求,需要时间,而js并没有去等待,所以在这里有一个时间差。

四、解决方法

1. 把实际要操作的动作放到回调函数中,逃避这个时间差

<script type="text/javascript">
function test(value){
 $.ajax({
 type: "POST",
 url: "test.php",
 data: "name="+value,
 success: function(msg){
 $("div").remove(); //实际要操作的动作
 }
 });
}
test("good");
</script>

前面几个例子,是为了举例,真正写代码,不会那样写,哈哈。

2. 进行同步请求

<script type="text/javascript">
function test(value){
 error = false;
 $.ajax({
 type: "POST",
 url: "test.php",
 async: false, //进行同步请求,默认是true的
 data: "name="+value,
 success: function(msg){
 if($.trim(msg) == '1'){
 error = true;
 alert(error); //弹一下error
 }
 }
 });
 alert(error); //在弹一下error
 if(error == true){
 $("div").remove();
 }
}
test("good");
</script>

当你刷新页面时,这里是弹出二个true,为什么会这样呢?加了async:false后,就会有一个等待的过程,也就是说ajax不执行完,不执行下面的代码。用这个方法有个问题,如果等待的时间过长,用户体验很不好的。

希望本文所述对大家jQuery程序设计有所帮助。

Javascript 相关文章推荐
如何将JS的变量值传递给ASP变量
Dec 10 Javascript
Jquery通过JSON字符串创建JSON对象
Aug 24 Javascript
javascript实现切换td中的值
Dec 05 Javascript
javascript获取重复次数最多的字符
Jul 08 Javascript
JavaScript验证Email(3种方法)
Sep 21 Javascript
javascript性能优化之事件委托实例详解
Dec 12 Javascript
简单实现js倒计时功能
Feb 13 Javascript
详解Node.js中exports和module.exports的区别
Apr 19 Javascript
vue 路由嵌套高亮问题的解决方法
May 17 Javascript
浅谈webpack devtool里的7种SourceMap模式
Jan 14 Javascript
vue 中url 链接左边的小图标更改问题
Dec 30 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 Javascript
jQuery简单获取键盘事件的方法
Jan 22 #Javascript
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
Jan 22 #Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 #Javascript
鼠标悬停小图标显示大图标
Jan 22 #Javascript
在JavaScript中call()与apply()区别
Jan 22 #Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 #Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 #Javascript
You might like
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
Redis构建分布式锁
2017/03/28 PHP
28个JS验证函数收集
2010/03/02 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
基于Python实现用户管理系统
2019/02/26 Python
python实现简单五子棋游戏
2019/06/18 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
python中return不返回值的问题解析
2020/07/22 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
商务日语毕业生自荐信范文
2013/11/14 职场文书
保密工作实施方案
2014/02/24 职场文书
综合管理员岗位职责
2015/02/11 职场文书
个人简历自我评价怎么写
2015/03/10 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
运动会新闻稿
2015/07/17 职场文书