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实现3D图片旋转展示效果代码
Sep 22 Javascript
jquery+css实现动感的图片切换效果
Nov 25 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
jquery购物车结算功能实现方法
Oct 29 Javascript
学习使用jQuery表单验证插件和日历插件
Feb 13 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
详解webpack自定义loader初探
Aug 29 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
详解如何用typescript开发koa2的二三事
Nov 13 Javascript
vue项目首屏加载时间优化实战
Apr 23 Javascript
JavaScript实现网页跨年倒计时
Dec 02 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之第一天
2006/10/09 PHP
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
php实现telnet功能示例
2014/04/08 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
用云开发Cloudbase实现小程序多图片内容安全监测的代码详解
2020/06/07 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
解决python 文本过滤和清理问题
2019/08/28 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
SmartBuyGlasses中国:唯视良品(销售名牌太阳镜、墨镜和眼镜框)
2017/07/03 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
函数指针的定义是什么
2016/08/14 面试题
护士节策划方案
2014/05/19 职场文书
农村门前三包责任书
2014/07/25 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
匿名检举信范文
2015/03/02 职场文书
入党自传范文2015
2015/06/26 职场文书
男生贾里读书笔记
2015/06/30 职场文书
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python