jQuery中借助deferred来请求及判断AJAX加载的实例讲解


Posted in Javascript onMay 24, 2016

ajax请求异步队列加载
我们在开发程序的时候通常会碰到使用ajax加载数据显示到列表的情况。ajax默认使用异步加载(async:true)。为什么不使用同步呢,因为ajax同步加载会UI渲染线程阻塞的问题。通常表现为在加载大量数据时由于加载时间过长导致页面不能点击、gif动画卡死以及浏览器崩溃等问题。所以,一般情况下,尽量使用ajax异步加载。
可是,我们有些时候的需求要求ajax同步加载,一个加载完再加载下一个,即所谓的队列。前面我们有说过,同步加载会引起UI渲染阻塞问题。那么我们要怎么实现顺序加载而不引起该问题呢?
示例代码一:

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
$(function(){
 $("#clickBtn").on("click",function(){
  getData(0,10);//输出0-9
 })
})

function getData(i,length){
 $.ajax({
  type:"post",
  url:"setDeffer.php",
  data:{
   data:i
  },
  async:true,//异步
  success:function(data){
   $("#showArea").text($("#showArea").text()+data+"\n");
   if(i<length-1){
    getData(i+1,length);
   }
  }
 });
}
</script>

PHP后台代码:

<?php
$str = $_POST["data"];
sleep(1);//延迟1秒
echo "输出".$str;
?>

当然,jquery也提供了我们deferred对象来解决回调函数的问题。
示例代码二:

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
$(function(){
 $("#clickBtn").on("click",function(){
  recycleData(0,10);//输出0-9
 })
})

function getData(i){
 var defer = $.Deferred();
 $.ajax({
  type:"post",
  url:"setDeffer.php",
  data:{
   data:i
  },
  async:true,//异步
  success:function(data){
   $("#showArea").text($("#showArea").text()+data+"\n");
   defer.resolve(data);
  }
 });
 return defer.promise();
}
function recycleData(i,length){
 $.when(getData(i)).done(function(data){//这里的data为defer在ajax保存下来的数据
  if(i<length-1){
   recycleData(i+1,length);//递归
  }
 })
}
</script>

这里首先创建一个deffered对象,在ajax的success函数中将ajax返回的数据保存在deffered对象中,然后返回deffered对象。这样就保证了在下一次ajax请求的时候这个ajax已经请求完成。deferred对象的好处包括它允许你给一个事件自由添加多个回调函数。或者给多个事件统一指定回调函数。

用jquery的deferred对象实现判断页面中所有图片加载完成
如果我们加载的是图片,对于图片是否加载完成,我们平时可以用监听图片load 方法来进行。今天主要介绍用jquery的deferred对象来进行判断。
关于jquery的deferred对象,是jquery的重点和难点。对于执行较长时间的函数,我们通常用deferred对象。
关于deferred对象,我在这里稍微介绍一下$.when().then()

function successFunc(){ console.log( “success!” ); } 
function failureFunc(){ console.log( “failure!” ); } 

$.when( 
$.ajax( "/main.php" ), 
$.ajax( "/modules.php" ), 
$.ajax( “/lists.php” ) 
).then( successFunc, failureFunc );

可以同时调用多个ajax,然后通过then来返回成功或者失败。

或者

$.when($.ajax("test1.html"), $.ajax("test2.html"))
.done(function(){ alert("哈哈,成功了!"); })
.fail(function(){ alert("出错啦!"); });

我们回到正题来,用jquery的deferred对象实现判断页面中所有图片加载完成

var defereds = []; //定义一个数组存放Deferred对象

$imgs.each(function() { //imgs循环所有图片
  var dfd = $.Deferred();// 新建一个deferred对象

  $(this).load(dfd.resolve());// 图片加载完成之后,改变deferred对象的执行状态
  defereds.push(dfd);//push到数组中
});
$.when.apply(null, defereds).done(function() {
  console.log('load compeleted');
});

因为 $.when 支持的参数是 $.when(dfd1, dfd2, dfd3, ...),所以我们这里使用了 apply 来接受数组参数。

上面提到了apply(),又引申到了 在JS中,call()方法和apply()方法

我在这里稍微介绍一下apply()

假如我们有prints函数:

function prints(a,b,c,d){
    console.log(a+b+c+d);
  }
  function example(a,b,c,d){
    prints.apply(this,[a,b,c,d]);
  }
  example("1","sd","wq","wqe") //输出:1sdwqwqe

或者我们可以这么写:

prints.apply(null,["脚","本","之","家"]);//输出:三水点靠木
Javascript 相关文章推荐
广告代码静态化js通用函数
May 09 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
Jun 24 Javascript
jQuery随便控制任意div隐藏的方法
Jun 28 Javascript
js动态拼接正则表达式的两种方法
Mar 04 Javascript
JQuery实现动态添加删除评论的方法
May 18 Javascript
jquery实现具有收缩功能的垂直导航菜单
Feb 16 Javascript
JavaScript 中 avalon绑定属性总结
Oct 19 Javascript
用file标签实现多图文件上传预览
Feb 14 Javascript
ES6新特性之Symbol类型用法分析
Mar 31 Javascript
AjaxUpLoad.js实现文件上传
Mar 05 Javascript
vuex vue简单使用知识点总结
Aug 29 Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 #Javascript
原生js的数组除重复简单实例
May 24 #Javascript
实例讲解jQuery中对事件的命名空间的运用
May 24 #Javascript
json传值以及ajax接收详解
May 24 #Javascript
JS获取屏幕高度的简单实现代码
May 24 #Javascript
基于JavaScript实现回到页面顶部动画代码
May 24 #Javascript
jquery简单插件制作(fn.extend)完整实例
May 24 #Javascript
You might like
php的控制语句
2006/10/09 PHP
PHP 已经成熟
2006/12/04 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
javascript 全角转换实现代码
2009/07/17 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
浅析Python中的for 循环
2016/06/09 Python
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
Ubuntu中配置TensorFlow使用环境的方法
2020/04/21 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
幼儿园美术教学反思
2014/01/31 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
培训班开班主持词
2015/07/02 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL