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 相关文章推荐
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
JavaScript 字符串处理函数使用小结
Dec 02 Javascript
js通过地址栏给action传值(中文乱码全是问号)
May 02 Javascript
JS+CSS实现下拉列表框美化效果(3款)
Aug 15 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
Sep 15 Javascript
js强制把网址设为默认首页
Sep 29 Javascript
Angularjs 滚动加载更多数据
Mar 17 Javascript
JavaScript实现图片懒加载(Lazyload)
Nov 28 Javascript
原生JS实现图片轮播切换效果
Dec 15 Javascript
Bootstrap CSS布局之列表
Dec 15 Javascript
在layui框架中select下拉框监听更改事件的例子
Sep 20 Javascript
如何基于原生javaScript生成带图片的二维码
Nov 21 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
星际流派综述
2020/03/04 星际争霸
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
jsTree事件和交互以及插件plugins详解
2017/08/29 Javascript
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
Python实现基本线性数据结构
2016/08/22 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Django 前后台的数据传递的方法
2017/08/08 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
python编写弹球游戏的实现代码
2018/03/12 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
Python3中列表list合并的四种方法
2019/04/19 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
python中threading开启关闭线程操作
2020/05/02 Python
Python中无限循环需要什么条件
2020/05/27 Python
Python如何定义有可选参数的元类
2020/07/31 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
安踏官方商城:anta.cn
2019/12/16 全球购物
创先争优标语
2014/06/27 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书