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面向对象编程
Mar 02 Javascript
IE与Firefox在JavaScript上的7个不同写法小结
Sep 14 Javascript
javascript中attachEvent用法实例分析
May 14 Javascript
跟我学习javascript的函数和函数表达式
Nov 16 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 Javascript
bootstrap datetimepicker2.3.11时间插件使用
Nov 19 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
Nov 29 Javascript
概述如何实现一个简单的浏览器端js模块加载器
Dec 07 Javascript
canvas实现图像布局填充功能
Feb 06 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
Dec 13 Javascript
优雅的elementUI table单元格可编辑实现方法详解
Dec 23 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提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
激活 ActiveX 控件
2006/10/09 Javascript
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
python删除某个目录文件夹的方法
2020/05/26 Python
Python configparser模块操作代码实例
2020/06/08 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
《画》教学反思
2014/04/14 职场文书
毕业论文评语大全
2014/04/29 职场文书
中秋客户感谢信
2015/01/22 职场文书
小学生交通安全寄语
2015/02/27 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
警告通知
2015/04/25 职场文书