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点赞功能实现代码 点个赞吧!
May 29 jQuery
jQuery序列化后的表单值转换成Json
Jun 16 jQuery
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
Aug 23 jQuery
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
jquery应用实例分享_实现手风琴特效
Feb 01 jQuery
jquery动态添加带有样式的HTML标签元素方法
Feb 24 jQuery
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
jQuery实现每隔一段时间自动更换样式的方法分析
May 03 jQuery
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
Feb 27 jQuery
jQuery 实现扁平式小清新导航
Jul 07 jQuery
jquery插件实现搜索历史
Apr 24 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+MYSQL的文章管理系统(二)
2006/10/09 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
js函数排序的实例代码
2013/07/01 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
jquery新的绑定事件机制on方法的使用方法
2014/04/15 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
javascript实现完美拖拽效果
2015/05/06 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
2015/12/04 Javascript
jQuery图片渐变特效的简单实现
2016/06/25 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
bootstrap table表格插件使用详解
2017/05/08 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
深入讲解Python中的迭代器和生成器
2015/10/26 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
体育老师的教学自我评价分享
2013/11/19 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
大专学生求职信
2014/07/04 职场文书
父亲去世追悼词
2015/06/23 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
JS实现简单的九宫格抽奖
2022/06/28 Javascript