交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • javascript异步处理与Jquery deferred对象用法总结

    本文实例讲述了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程序设计有所帮助。

    您可能感兴趣的文章:

    • jQuery Ajax异步处理Json数据详解
    • 详谈 Jquery Ajax异步处理Json数据.
    • jQuery的deferred对象使用详解
    • 利用jQuery的deferred对象实现异步按顺序加载JS文件
    • jQuery.deferred对象使用详解
    • jQuery通过deferred对象管理ajax异步
    • 以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
    • jQuery的promise与deferred对象在异步回调中的作用
    • jQuery中deferred对象使用方法详解
    • jQuery的deferred对象详解

    广而告之:
    热门推荐:
    CI框架网页缓存简单用法分析

    本文实例讲述了CI框架网页缓存简单用法。分享给大家供大家参考,具体如下: CodeIgniter 可以让你通过缓存页面来达到更好的性能。 尽管 CodeIgniter 已经相当高效了,但是网页中的动态内容、主机的内存 CPU 和数据库读取速度等因素直接影响了网页的加载速度。 依靠网页缓存, ···

    使用jQuery动态加载js脚本文件的方法

    它们很强大,但有时候也会得不偿失。如果你使用的是jQuery,它里面有一个内置的方法可以用来加载单个js文件。当你需要延迟加载一些js插件或其它类型的文件时,可以使用这个方法。下面就介绍一下如何使用它! 一、jQuery getScript()方法加载JavaScript jQuery内置了一个···

    Angular+Node生成随机数的方法

    本文实例讲述了Angular+Node生成随机数的方法。分享给大家供大家参考,具体如下: 以前写过一个PHP生成随机数,然后jquey ajax获取,再jQuery改变文本的随机数的程序 现在用Angular 和 Node来重写一下 Angular的好处是双向绑定,这样直接设置变量,不用再重新设置了 Node的好处···

    两种方法实现文本框输入内容提示消失

    第一种方法: 基于HTML5 input标签的新特性 - placeholder 。另外,x-webkit-speech 属性可以实现语音输入功能。 复制代码 代码如下: <div><input type="email" name="email" spellcheck="false" placeholder="邮 箱" autofocus tabindex="1" x-webkit-speech&g···

    PHP SFTP实现上传下载功能

     一、SFTP介绍: 使用SSH协议进行FTP传输的协议叫SFTP(安全文件传输)Sftp和Ftp都是文件传输协议。区别:sftp是ssh内含的协议(ssh是加密的telnet协议), 只要sshd服务器启动了,它就可用,而且sftp安全性较高,它本身不需要ftp服务器启动。 sftp = ssh + ftp(安···

    微信小程序 子级页面返回父级并把子级参数带回父级实现方法

    说到页面之间的跳转,跳转中顺带些参数,在程序猿的生活中是很常用的,下面就让我们来看看吧! 这里有两种方法来解决: 方法一 就是我们常用的本地储存,在当前子级页面用( wx.setStorage || wx.setStorageSync )储存好,跳转到父级页面的时候取出,采用( wx.getStorage ||···

    jquery缓动swing liner控制动画过程不同时刻的速度

    jQuery效果函数(slideUp()、fadeIn()等)和animation()函数都接收另一个用来控制动画过程的速度的参数,这就是缓动(easing),它确定了动画过程不同时刻的速度。例如,将一个元素移过页面的时候,可能让这个元素缓慢地开始移动,然后变得很快,最后随着动画的完成再次慢下···

    帝国ecms批量勾选或批量去除关键字替换功能

    很多文章忘记打勾“关键字替换”了,一个页面一个页面去修改很麻烦,如果有这样的批量处理功能就好了,一更新全OK 批量勾选关键字运行 update phome_ecms_news set dokey=1; 批量去除关键字运行 update phome_ecms_news set dokey=0;

    mysql删除重复记录语句的方法

    例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name value 1 a pp 3 b iii 4 b pp 6 c pp 8 c iii 方法1 delete YourTable where [id] not in ( select max([id]) from YourTable group by (name + v···

    jQuery中:disabled选择器用法实例

    本文实例讲述了jQuery中:disabled选择器用法。分享给大家供大家参考。具体分析如下: 此选择器能够选取所有禁用的表单元素。 语法结构: 复制代码 代码如下:$(":disabled") 此选择器一般也要和其他选择器配合使用,比如类选择器、元素选择器等等。 复制代码 代码如下:$("input:d···