理解jQuery文档中的$ .deferred示例

时间:2015-07-07 08:18:10

标签: javascript jquery

我只是想揭开方法$.Deferred在jQuery中的工作原理。我知道它主要用于AJAX的东西,但我也想把这个方法用于非AJAX的东西。我正在阅读the jQuery documentation这个方法,并遇到了以下代码:

$.fn.bindOnce = function( event, callback ) {
    var element = $( this[ 0 ] ),
        defer = element.data( "bind_once_defer_" + event );

    if ( !defer ) {
        defer = $.Deferred();
        function deferCallback() {
            element.unbind( event, deferCallback );
            defer.resolveWith( this, arguments );
        }
        element.bind( event, deferCallback )
        element.data( "bind_once_defer_" + event , defer );
    }

    return defer.done( callback ).promise(); 
   // what is this piece of code really doing and why is it necessary ? 
};

...现在,如果你逐行浏览代码,那么很容易就会发生什么事情。

jQuery文档告诉我们一行一行的发生情况,如下:

  
      
  • 检查元素是否已为给定事件附加了延迟
  •   
  • 如果没有,请创建它并使其在第一次触发事件时解决。
  •   
  • 然后将给定的回调附加到延期并返回承诺。
  •   

我遇到的困难以及我无法理解的界限如下:

return defer.done( callback ).promise();

我无法理解这行代码的目的以及为什么它有用以及promise方法在这种情况下究竟做了什么?

任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

promise()为延迟创建 promise 对象。 promise对象公开了延迟时可用的方法的子集;允许客户注册事件处理程序到各种事件,但修改延迟本身。

来自jQuery docs

  

promise对象提供Deferred对象(thendonefailalwayspipe方法的子集,progressstatepromise),以防止用户更改已延期的状态。

因此,

return defer.done( callback ).promise();

...正在添加要在延迟(callback)解析时执行的defer函数,然后返回延迟的相应承诺。

您可能会发现以下问题很有用; What are the differences between Deferred, Promise and Future in JavaScript?