zoukankan      html  css  js  c++  java
  • Jquery(15)Jquery 回调对象与延迟对象

    一、回调对象Callbacks

    jQuery 1.7 版本中新增的 jQuery.Callbacks() 函数,返回一个多功能对象,此对象提供了一种强大的方法来管理回调列表。它能够增加、删除、触发、禁用回调函数。

    1、定义和用法

    $.Callbacks() 指一个多用途的回调函数列表对象,提供了一种强大的方法来管理回调函数列对。

    提示: $.Callbacks 是在 jQuery 内部使用,如为 .ajax,$.Deferred 等组件提供基础功能的函数。它也可以用在类似功能的一些组件中,如自己开发的插件。

    $(function () { 
        function fn1( value ) {
            alert( value );
        }
        function fn2( value ) {
            fn1("fn2 says: " + value);
            return false;
        }
        var callbacks = $.Callbacks();
        callbacks.add( fn1 );    
        callbacks.fire( "foo!" );// 输出: foo!    
        callbacks.add( fn2 );
        callbacks.fire( "bar!" );// 先执行f1,再执行f2。输出: bar!, fn2 says: bar!
    })

    2、支持的 Flags 参数

    这个 flags 参数是 $.Callbacks() 的一个可选参数, 结构为一个用空格标记分隔的标志可选列表,用来改变回调列表中的行为 (比如. $.Callbacks( 'unique stopOnFalse' ))。
    以下是可用的 flags:

    • once确保这个回调列表只执行一次
    • memory缓存上一次fire时的参数值,当add()添加回调函数时,直接用上一次的参数值立刻调用新加入的回调函数
    • unique一个回调只会被添加一次,不会重复添加
    • stopOnFalse某个回调函数返回false之后中断后面的回调函数

    下面是 $.Callbacks( "unique" ) 的一个例子

    $(function () { 
        function fn1( value ) {
            alert( value );
        }
        function fn2( value ) {
            fn1("fn2 says: " + value);
            return false;
        }
        var callbacks = $.Callbacks( "unique" );
        callbacks.add( fn1 );
        callbacks.fire( "foo" );
        callbacks.add( fn1 ); // repeat addition
        callbacks.add( fn2 );
        callbacks.fire( "bar" );
        callbacks.remove( fn2 );
        callbacks.fire( "foobar" );
        /*输出:
        foo
        bar
        fn2 says:bar
        foobar
        */
    })

    尝试一下 »

    $.Callbacks() 支持一个列表设置多个flags(标识)而不仅仅是一个,有一个累积效应,类似"&&"。
    下面是 $.Callbacks( 'unique memory' ) 的一个例子

    $(function () { 
        function fn1( value ) {
            alert( value );
            return false;
        }
         
        function fn2( value ) {
            fn1( "fn2 says: " + value );
            return false;
        } 
        var callbacks = $.Callbacks( "unique memory" );
        callbacks.add( fn1 );
        callbacks.fire( "foo" );
        callbacks.add( fn1 ); // repeat addition
        callbacks.add( fn2 );
        callbacks.fire( "bar" );
        callbacks.add( fn2 );
        callbacks.fire( "baz" );
        callbacks.remove( fn2 );
        callbacks.fire( "foobar" ); 
        /*输出:
        foo
        fn2 says:foo
        bar
        fn2 says:bar
        baz
        fn2 says:baz
        foobar*/
    })

    尝试一下 »

    3、方法清单:

    二、延迟对象deferred

    在jQuery 1.5中新增了 Deferred 延迟对象,它是通过调用 jQuery.Deferred() 方法来创建的可链接的实用对象。它可注册多个回调函数到回调列表,调用回调列表并且传递异步或同步功能的成功或失败的状态。
    延迟对象是可链接的,类似于一个 jQuery 对象可链接的方式,区别于它有自己的方法。在创建一个 Deferred 对象之后,您可以使用以下任何方法,直接链接到通过调用一个或多个的方法创建或保存的对象。

    1、$.Deferred()定义和用法

    $.Deferred() 是一个构造函数,用来返回一个链式实用对象方法来注册多个回调,并且调用回调队列,传递任何同步或异步功能成功或失败的状态。

    1. $.Deferred() 构造函数创建一个新的 Deferred(延迟)对象, jQuery.Deferred 可传递一个可选的函数,该函数在构造方法返回之前被调用并传递一个新的 Deferred 对象作为函数的第一个参数。例如被调用的函数可以使用 deferred.then()来附加回调函数。
    2. 一个 Deferred 对象开始于挂起状态。任何使用 deferred.then(), deferred.always(), deferred.done(), 或者 deferred.fail() 添加到这个对象的回调函数都是排队等待执行的。调用 deferred.resolve() 或 eferred.resolveWith() 转换延迟到解决状态后立即执行设置的 doneCallbacks 。调用 deferred.reject() 或 deferred.rejectWith() 转换延迟到拒绝状态后立即执行设置的 failCallbacks 。一旦对象已经进入了解决或拒绝状态,它保持该状态。回调仍然可以添加到已解决或已拒绝的 Deferred 对象——它们会立即执行。

    设定两个延时时间是随机的定时器,分别用于解决(resolve)和拒绝(reject)延迟对象

    $(function () { 
        function asyncEvent(){
            var dfd = new jQuery.Deferred();
            // 在一个随机的时间间隔之后 Resolve (解决状态)
            setTimeout(function(){
                dfd.resolve("欢呼");
            }, Math.floor(400+Math.random()*2000));
    
            // 在一个随机的时间间隔之后 reject (拒绝状态)
            setTimeout(function(){
                dfd.reject("对不起");
            }, Math.floor(400+Math.random()*2000));
    
            // 每半秒显示一个"working..."消息
            setTimeout(function working(){
                if ( dfd.state() === "pending" ) {
                    dfd.notify("working... ");
                    setTimeout(working, 500);
                }
            }, 1);
            // 返回 Promise 对象,调用者不能改变延迟对象
            return dfd.promise();
        }
        // 为异步函数附加一个done, fail, 和 progress 处理程序
        $.when( asyncEvent() ).then(
            function(status){
                alert( status+', 事情进展顺利' );
            },
            function(status){
                alert( status+', 这次你失败了' );
            },
            function(status){
                $("body").append(status);
            }
        );
    })

    尝试一下 »

    2、deferred.promise():返回Deferred(延迟)的Promise对象。

    1. 方法允许一个异步函数阻止那些干涉其内部请求的进度(progress)或状态(status)的其它代码。
    2. 只包含 deferred 对象的一组方法,包括:done(),then(),fail(),isResolved(), isRejected(), always(), 这些方法只能观察一个 deferred 的状态,而无法更改 deferred 对象的内在状态。
    3. deferred.promise()也可以接受一个 target 参数,此时传入的 target 将被赋予 Promise 的方法,并作为结果返回,而不是创建一个新对象。
    deferred.promise( [target ] )
    使用目标参数

    $(function () { 
        // 现有对象
        var obj = {
            hello: function( name ) {
                alert( "Hello " + name );
            }
        },
        // 创建一个延迟 Deferred
        defer = $.Deferred();
        // 设置对象作为 promise
        defer.promise( obj );
        // Resolve (解决) 该对象
        defer.resolve( "John" );
        // 使用该对象作为 Promise
        obj.done(function( name ) {
            obj.hello( name ); //将弹出 "Hello John"
        }).hello( "Karl" ); // 将弹出 "Hello Karl";
    })

    3、.promise():返回一个 Promise 对象用来观察当某种类型的所有行动绑定到集合,排队与否还是已经完成。

    1. .promise() 方法返回一个动态生成的 Promise,当绑定到集合中的所有特定动作(action)已经被加入或未被加入到队列中时,生成的 Promise 将被受理(resolve)。
    2. type 的默认值是"fx" ,这意味着被受理(resolve)的 Promise 对象是在所有被选中元素的动画都完成时返回的。
    3. 如果提供 target 参数,.promise() 在该参数上添加方法,然后返回这个对象,而不是创建一个新的。它适用于在一个已经存在的对象上添加 Promise 行为的情况。

      语法:.promise( [type ] [, target ] )

      type:String类型 需要待观察队列类型。

      target:PlainObject类型 将要绑定 promise 方法的对象。

      在一个没有激活动画的集合上调用 .promise()

      $(function () { 
          var div = $( "<div />" );
          div.promise().done(function( arg1 ) {
              alert( this === div && arg1 === div );//弹出 "true"
          });
      })

      动画结束时调用受理返回的 Promise
      当所有的动画结束时(包括那些在动画回调函数和之后添加的回调函数中初始化的动画),受理(Resolve)返回的 Promise。

      $(function () { 
          $( "button" ).on( "click", function() {
              $( "p" ).append( "已开始..." );
      
              $( "div" ).each(function( i ) {
                  $( this ).fadeIn().fadeOut( 100 * ( i + 1 ) );
              });
      
              $( "div" ).promise().done(function() {
                  $( "p" ).append( " 完成! " );
              });
          });
      })

    3、jQuery.when():提供一种方法来执行一个或多个对象的回调函数, Deferred(延迟)对象通常表示异步事件。

    4、方法清单:

    • deferred.progress():当Deferred(延迟)对象生成进度通知时,调用添加处理程序。
    • deferred.done():当Deferred(延迟)对象解决时,调用添加处理程序。
    • deferred.fail():当Deferred(延迟)对象拒绝时,调用添加处理程序。
    • deferred.always():当Deferred(延迟)对象解决或拒绝时,调用添加处理程序。
    • deferred.catch():当Deferred对象被拒绝(reject)时,调用添加的处理程序。
    • deferred.notify():根据给定的 args参数 调用Deferred(延迟)对象上进行中的回调 (progressCallbacks)。
    • deferred.notifyWith():根据给定的上下文(context)和args递延调用Deferred(延迟)对象上进行中的回调(progressCallbacks )。
    • deferred.resolve():解决Deferred(延迟)对象,并根据给定的args参数调用任何完成回调函数(doneCallbacks)。
    • deferred.resolveWith():解决Deferred(延迟)对象,并根据给定的 context和args参数调用任何完成回调函数(doneCallbacks)。
    • deferred.reject():拒绝Deferred(延迟)对象,并根据给定的args参数调用任何失败回调函数(failCallbacks)。
    • deferred.rejectWith():拒绝Deferred(延迟)对象,并根据给定的 context和args参数调用任何失败回调函数(failCallbacks)。
    • deferred.pipe():实用的方法来过滤 and/or 链Deferreds。
    • deferred.state():确定一个Deferred(延迟)对象的当前状态。
    • deferred.then():当Deferred(延迟)对象解决,拒绝或仍在进行中时,调用添加处理程序。
  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第三章Databases and Database Files(2)
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(4)
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(1)
    《Microsoft Sql server 2008 Internals》读书笔记第三章Databases and Database Files(1)
    转载:Windows Azure Web Sites VS Web Role
    jQuery 的 ready 函数是如何工作的?
    什么是相关性以及为什么需要初始化它?
    云中漫步 2:使用 VS2012 与 Windows Azure Web 站点创建并发布 ASP.NET Web 应用程序
    转载:Window Azure 中的Web Role详解
    mybatis.net 5 嵌入资源与引用资源
  • 原文地址:https://www.cnblogs.com/springsnow/p/12168184.html
Copyright © 2011-2022 走看看