zoukankan      html  css  js  c++  java
  • jQuery的Deferred对象教程

    阮一峰的这往篇教程讲得非常好:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

    jQuery官网文档:http://api.jquery.com/category/deferred-object/

    -------------------------------------

    以下将阮一峰的教程的后半部分做一个整理,前半部分已经非常 好了

    -------------------------------------

    五、普通操作的回调函数接口

    deferred对象的最大优点,就是它把这一套回调函数接口,从ajax操作扩展到了所有操作。也就是说,任何一个操作----不管是ajax操作还是本地操作,也不管是异步操作还是同步操作----都可以使用deferred对象的各种方法,指定回调函数。

    我们来看一个具体的例子。假定有一个很耗时的操作wait:

      var wait = function(){

        var tasks = function(){

          alert("执行完毕!");

        };

        setTimeout(tasks,5000);

      };

    我们为它指定回调函数,应该怎么做呢?

    很自然的,你会想到,可以使用$.when():

      $.when(wait())

      .done(function(){ alert("哈哈,成功了!"); })

      .fail(function(){ alert("出错啦!"); });

    (运行代码示例5

    但是,这样写的话,done()方法会立即执行,起不到回调函数的作用。原因在于$.when()的参数只能是deferred对象,所以必须对wait()进行改写:

      

      var wait = function(){

        var dtd = $.Deferred(); // 新建一个deferred对象  

        var tasks = function(){

          alert("执行完毕!");

          dtd.resolve(); // 改变deferred对象的执行状态

        };

        setTimeout(tasks,5000);

        return dtd.promise();//promise()函数将Deferred()对象的状态字段隐藏,避免其返回后被修改。

      };

    现在,wait()函数返回的是deferred对象,这就可以加上链式操作了。

    wait().done(function(){ alert("哈哈,成功了!"); })

    .fail(function(){ alert("出错啦!"); });

    (运行代码示例10

    十、小结:deferred对象的方法

    前面已经讲到了deferred对象的多种方法,下面做一个总结:

      (1) $.Deferred() 生成一个deferred对象。

      (2) deferred.done() 指定操作成功时的回调函数

      (3) deferred.fail() 指定操作失败时的回调函数

      (4) deferred.promise() 没有参数时,返回一个新的deferred对象,该对象的运行状态无法被改变;接受参数时,作用为在参数对象上部署deferred接口。

      (5) deferred.resolve() 手动改变deferred对象的运行状态为"已完成",从而立即触发done()方法。

      (6)deferred.reject() 这个方法与deferred.resolve()正好相反,调用后将deferred对象的运行状态变为"已失败",从而立即触发fail()方法。

      (7) $.when() 为多个操作指定回调函数。

    除了这些方法以外,deferred对象还有二个重要方法,上面的教程中没有涉及到。

      (8)deferred.then()

    有时为了省事,可以把done()和fail()合在一起写,这就是then()方法。

      $.when($.ajax( "/main.php" ))

      .then(successFunc, failureFunc );

    如果then()有两个参数,那么第一个参数是done()方法的回调函数,第二个参数是fail()方法的回调方法。如果then()只有一个参数,那么等同于done()。

      (9)deferred.always()

    这个方法也是用来指定回调函数的,它的作用是,不管调用的是deferred.resolve()还是deferred.reject(),最后总是执行。

      $.ajax( "test.html" )

      .always( function() { alert("已执行!");} );

  • 相关阅读:
    FFT模板
    树链剖分模板
    295. 数据流的中位数
    我罗斯方块最终篇
    面向对象程序设计寒假作业3
    2020面向对象寒假作业(二)
    2020面向对象程序设计寒假作业1
    违规二哥
    士大夫和为啥
    啥给测试
  • 原文地址:https://www.cnblogs.com/erentec/p/4973879.html
Copyright © 2011-2022 走看看