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 相关文章推荐
javascript 选择文件夹对话框(web)
Jul 07 Javascript
javascript代码编写需要注意的7个小细节小结
Sep 21 Javascript
JavaScript中this的使用详解
Nov 08 Javascript
js简单实现根据身份证号码识别性别年龄生日
Nov 29 Javascript
js实现的点击div区域外隐藏div区域
Jun 30 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
May 06 Javascript
jQuery validate 验证radio实例
Mar 01 Javascript
Javascript实现基本运算器
Jul 15 Javascript
JavaScript继承与多继承实例分析
May 26 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
Vue路由模块化配置的完整步骤
Aug 14 Javascript
JavaScript中document.activeELement焦点元素介绍
Nov 27 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-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
django解决订单并发问题【推荐】
2019/07/31 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
Python如何读写CSV文件
2020/08/13 Python
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
商务英语本科生的自我评价分享
2013/11/15 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
花田少年史观后感
2015/06/16 职场文书
商业计划书格式、范文
2019/03/21 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis