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

 更新时间:2019年06月04日 10:36:33   作者:轻舞肥羊  
这篇文章主要介绍了javascript异步处理与Jquery deferred对象用法,结合实例形式总结分析了jQuery异步请求处理相关操作技巧,需要的朋友可以参考下

本文实例讲述了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 form操作技巧汇总》、《jQuery文件与目录操作技巧汇总》、《jquery中Ajax用法总结》、《jQuery扩展技巧总结》、《jquery选择器用法总结》及《jQuery常用插件及用法总结

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

相关文章

  • DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)

    DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)

    DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有着相当大的影响。这两种事件流分别是捕获和冒泡。和许多Web技术一样,在它们成为标准之前,Netscape和微软各自不同地实现了它们,下面介绍DOM事件阶段以及事件捕获与事件冒泡先后执行顺序
    2015-08-08
  • jQuery中的for循环var与let的区别

    jQuery中的for循环var与let的区别

    这篇文章主要介绍了jQuery中的for循环var与let的区别 ,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • JQuery中的常用事件、对象属性与使用方法分析

    JQuery中的常用事件、对象属性与使用方法分析

    这篇文章主要介绍了JQuery中的常用事件、对象属性与使用方法,结合实例形式分析了jquery事件、对象属性、方法相关使用技巧,需要的朋友可以参考下
    2019-12-12
  • jQuery Mobile操作HTML5的常用函数总结

    jQuery Mobile操作HTML5的常用函数总结

    jQuery Mobile是针对移动端开发的JavaScript框架,正如其名基于jQuery库,jQuery Mobile主要被用来操作HTML5设计页面UI,下面就来看一下jQuery Mobile操作HTML5的常用函数总结:
    2016-05-05
  • 编写简单的jQuery提示插件

    编写简单的jQuery提示插件

    这篇文章主要介绍了自己编写简单的jQuery提示插件的方法及示例,非常的不错,推荐给正在学习jQuery的小伙伴。
    2014-12-12
  • jQuery在header中设置请求信息的方法

    jQuery在header中设置请求信息的方法

    这篇文章主要介绍了jQuery在header中设置请求信息的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • JQ图片文件上传之前预览功能的简单实例(分享)

    JQ图片文件上传之前预览功能的简单实例(分享)

    下面小编就为大家带来一篇JQ图片文件上传之前预览功能的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • jquery ui bootstrap 实现自定义风格

    jquery ui bootstrap 实现自定义风格

    本文主要是给大家分享了jQuery UI bootstrap的自定义风格,以及自定义的方法,非常的实用,有需要的小伙伴千万不要错过
    2014-11-11
  • jqeury-easyui-layout问题解决方法

    jqeury-easyui-layout问题解决方法

    jqeury-easyui-layout问题:当把class=“easyui-layout”写在一个独立的div中时,layout的样式无法显示,具体示例如下
    2014-03-03
  • js中return false(阻止)的用法

    js中return false(阻止)的用法

    return false 阻止表单提交不起的问题困扰我很久,关于onsubmit=return false有以下几点要注意的地方,感兴趣的各位可以参考下
    2013-08-08

最新评论