javascript异步处理与Jquery deferred对象用法总结


Posted in jQuery onJune 04, 2019

本文实例讲述了javascript异步处理与Jquery deferred对象用法。分享给大家供大家参考,具体如下:

这是项目组老大整理的一些关于jquery 异步处理请求,以及使用 jquery deferred 对象的一些常见方法。虽然是项目上总结出来的。但也比较通用,分享在这里。

  • 所有的Ajax操作都采用异步处理。
  • 采用Jquery的Deffered对象来处理异步调用。
  • 因为是异步调用,所以$.Ajax函数的返回值不代表返回的结果,只是一个Deffered对象。
  • Ajax调用完成后执行的逻辑可以写成函数作为参数传递给Deffered对象的done(), fail(), always()函数来执行。
  • 如果一个函数包含Ajax调用,那么这个函数必须将Ajax返回的异步对象作为自己的返回值,否则函数的调用者无法保证后续代码的正常执行顺序。

例如:

function readData(){
  $.ajax({ url:"test", dataType:"json" })
  .done(function() {
    //....
  });
}
readData();
//...这里想添加一些后续处理,但程序将在Ajax回调前执行,所以无法达到预期目的
正确的代码:
function readData(){
  return $.ajax({ url:"test", dataType:"json" })
  .done(function() {
    //....
  });
}
readData().done(function () {
  //...想添加的后续处理可以加在这里处理
});
  • 如果需要调用多个Ajax请求,请注意Ajax请求是否可以同时进行,如果可以应该使用when()函数来同时执行,以提高程序的运行效率和可读性。
  • deferred对象有一个方法promise(),可以阻止其他代码修改deferred对象的状态,也就是其他代码调用reslove()reject()无效。
var dtd = $.Deferred(); // 新建一个Deferred对象
var wait = function(dtd){
  var tasks = function(){
    alert("执行完毕!");
    dtd.resolve(); // 改变Deferred对象的执行状态
  };
  setTimeout(tasks,5000);
  return dtd;
};
wait(dtd)
.done(function(){ alert("成功了!"); })
.fail(function(){ alert("出错啦!"); });
dtd.resolve();  //这里修改了dtd对象的状态,导致立刻出现“成功了!”的提示

正确的例子:

var dtd = $.Deferred(); // 新建一个Deferred对象
var wait = function(dtd){
  var tasks = function(){
    alert("执行完毕!");
    dtd.resolve(); // 改变Deferred对象的执行状态
  };
  setTimeout(tasks,5000);
  return dtd.promise(); // 返回promise对象
};
wait(dtd)
.done(function(){ alert("成功了!"); })
.fail(function(){ alert("出错啦!"); });
dtd.resolve();  //这里修改dtd对象的状态无效
  • 一些情况的处理:

1.嵌套异步操作的处理。

如果一个函数内部执行异步任务,并且在异步任务的done回调内会嵌套另一个异步任务,那么简单返回第一个异步任务的返回值是不行的,需要另外自行定义一个Deferred对象作为返回值。

function loadComponent(id){
  var dtd = $.Deferred();
  //loadScript将异步加载一个js文件,所以返回值是一个Deffered对象
  return loadScript(id)
  .done(function() {
    //js加载后,触发component的load事件,此事件内将使用Ajax获取页面模板和数据,生成最终的html
    app.getComponent(id).trigger("load")
    .done( function(){
      dtd.reslove(agruments);
    }).fail( function(){
      dtd.reject(agruments);
    });
  });
  //返回自定义的dtd对象,才能保证返回值的done回调在load事件完成后执行
  return dtd;
}

2.一个函数内同时包含同步和异步case的处理。

/* 这个函数返回一个异步对象,当异步对象执行done时,表示component被加载完成 */
function requireComponent(id){
  if (this.components[id]){
    //如果component已经被加载,直接返回一个reslove的异步对象,否则返回值内容与else分支不同,后续代码难以处理
    var dtd = $.Deferred();
    dtd.reslove(this.getComponent(id));
    return dtd;
  }
  else{
    //如果component未被加载,loadScript将异步加载JavaScript并执行,然后将被加载的component放入this.components
    return loadScript(id);
  }
}
  • Jquery异步模型有一个缺点,就是缺乏类似wait操作的处理能力,如果多个异步调用要顺序发生时,就要在done里面嵌套处理,影响代码可读性.
aSyncTask1.done( function () {
  //...第一个操作完成后的处理
  asyncTask2.done( function () {
    //...第二个操作完成后的处理
    asyncTask3.done( function () {
      //...第三个操作完成后的处理
    });
  })
})

希望本文所述对大家jQuery程序设计有所帮助。

jQuery 相关文章推荐
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
Mar 22 jQuery
jquery 禁止鼠标右键并监听右键事件
Apr 27 jQuery
jQuery树插件zTree使用方法详解
May 02 jQuery
基于jQuery实现图片推拉门动画效果的两种方法
Aug 26 jQuery
jQuery事件对象的属性和方法详解
Sep 09 jQuery
使用JQuery实现图片轮播效果的实例(推荐)
Oct 24 jQuery
简单实现jQuery弹窗效果
Oct 30 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
Jan 24 jQuery
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
Jun 18 jQuery
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
一文快速了解JQuery中的AJAX
May 31 #jQuery
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 #jQuery
jQuery模拟html下拉多选框的原生实现方法示例
May 30 #jQuery
JS拖动选择table里的单元格完整实例【基于jQuery】
May 28 #jQuery
jquery实现Ajax请求的几种常见方式总结
May 28 #jQuery
jquery操作select常见方法大全【7种情况】
May 28 #jQuery
jQuery实现高级检索功能
May 28 #jQuery
You might like
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
使用layui 的layedit定义自己的toolbar方法
2019/09/18 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
python实现二叉树的遍历
2017/12/11 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
如何在 Django 模板中输出 "{{"
2020/01/24 Python
浅析python函数式编程
2020/09/26 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
食品行业求职人的自我评价
2014/01/19 职场文书
项目投资建议书
2014/05/16 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
动物科学专业求职信
2014/07/27 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
用Python生成会跳舞的美女
2022/01/18 Python