Jquery回调对象与延迟对象用法详解

目录
  • 一、回调对象Callbacks
    • 1、定义和用法
    • 2、支持的 Flags 参数
    • 3、方法清单:
  • 二、延迟对象:deferred
    • 1、$.Deferred()定义和用法
    • 2、deferred.promise():
    • 3、.promise():
    • 4、jQuery.when():
    • 5、方法清单:

一、回调对象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、方法清单:

  • callbacks.add():回调列表中添加一个回调或回调的集合。
  • callbacks.disable():禁用回调列表中的回调
  • callbacks.disabled():确定回调列表是否已被禁用。
  • callbacks.empty():从列表中删除所有的回调.
  • callbacks.fire():用给定的参数调用所有的回调
  • callbacks.fired():访问给定的上下文和参数列表中的所有回调。
  • callbacks.fireWith():访问给定的上下文和参数列表中的所有回调。
  • callbacks.has():确定列表中是否提供一个回调
  • callbacks.lock():锁定当前状态的回调列表。
  • callbacks.locked():确定回调列表是否已被锁定。
  • callbacks.remove():从回调列表中的删除一个回调或回调集合。

二、延迟对象:deferred

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

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

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

  • $.Deferred() 构造函数创建一个新的 Deferred(延迟)对象, jQuery.Deferred 可传递一个可选的函数,该函数在构造方法返回之前被调用并传递一个新的 Deferred 对象作为函数的第一个参数。例如被调用的函数可以使用 deferred.then()来附加回调函数。
  • 一个 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对象。

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

3、.promise():

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

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

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

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

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

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

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

当所有的动画结束时(包括那些在动画回调函数和之后添加的回调函数中初始化的动画),受理(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( " 完成! " );
        });
    });
})

4、jQuery.when():

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

5、方法清单:

  • 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(延迟)对象解决,拒绝或仍在进行中时,调用添加处理程序。

到此这篇关于Jquery回调对象与延迟对象的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • jQuery回调方法使用示例

    本文实例讲述了jQuery回调方法使用.分享给大家供大家参考,具体如下: 方法参数带有function方法,并且执行完后把计算的数据返回 function a1(p){ // p 为调用此方法传递的object对象 var callback = p?p.callback:null; // 获取参数对象中的回调方法 if($.isFunction(p.callback)){ // 如果有回调方法 callback("123"); // 返回一个计算后的数据,方便回调方法使用它 } } f

  • jQuery的promise与deferred对象在异步回调中的作用

    一.前言 为了让前端们从回调的地狱中回到天堂, jQuery 也引入了 Promise 的概念. Promise 是一种令代码异步行为更加优雅的抽象,有了它,我们就可以像写同步代码一样去写异步代码. jQuery 从1.5版本开始实现了 CommonJS Promise/A 规范这一重量级方案,不过没有严格按照规范进行实现,有一些API上的差异. 好,让我们来看看他们的特性吧( 本文示例基于jquery 1.8版本以上 ). 二.示例 以前写动画时,我们通常是这么干的: $('.animateE

  • jQuery插件扩展实例【添加回调函数】

    本文实例讲述了jQuery插件扩展的方法.分享给大家供大家参考,具体如下: <script language="javascript" type="text/javascript"> function doSomething(callback) { // - // Call the callback callback('stuff', 'goes', 'here'); // 给callback赋值,callback是个函数变量 } function fo

  • jquery 延迟执行实例介绍

    复制代码 代码如下: $(function(){ var $inputs = $('input[type=button]') .delay(500) .queue(function(){$(this).hide().dequeue();}) .delay(1500) .queue(function(){$(this).show();}); }); 以上代码让页面中的按钮在页面加载后500毫秒隐藏,然后再过1500毫秒显示出来. 复制代码 代码如下: $(function(){ var $inpu

  • jQuery实现延迟跳转的方法

    本文实例讲述了jQuery实现延迟跳转的方法.分享给大家供大家参考.具体实现方法如下: function delayer(){ window.location = "http://www.jb51.net/"; } jQuery(document).ready(function(){ setTimeout('delayer()', 5000); //这里实现延迟5秒跳转 }); 希望本文所述对大家的jQuery程序设计有所帮助.

  • jquery延迟对象解析

    技术一般水平有限,有什么错的地方,望大家指正. ES6已经实现了延迟对象Promise,但是今天主角是JQ里面的延迟对象,套路其实都是差不多的.下面先看一个比较牵强的例子: <button id="add">add</button><button id="remove">remove</button> <div id="content"></div> $(function()

  • jQuery学习笔记之回调函数

    1.回调函数定义 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,才会真正的执行回调函数内部的方法. 2.代码 JS代码 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opacity:0.1

  • jQuery实现带延迟效果的滑动菜单代码

    本文实例讲述了jQuery实现带延迟效果的滑动菜单代码.分享给大家供大家参考.具体如下: 这是一款基于jQuery的滑动菜单,鼠标移到某菜单项上,菜单的背景可以滑动过来,平滑的滑动效果,炫动的导航效果,相比没有动画的菜单,这款菜单真的挺不错哦. 先来看看运行效果截图: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-delay-style-menu-nav-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C/

  • jQuery延迟执行的实现方法

    本文实例讲述了jQuery延迟执行的实现方法.分享给大家供大家参考,具体如下: 做一个控件时碰到的一些无法同步处理的事件,可以用这样的延迟方法. <html> <script src="js/jquery.js"></script> <script> $(function(){ $('#test').bind("click",function(){ setTimeout(function(){alert($('#tes

  • jQuery选择器之属性筛选选择器用法详解

    在这么多属性选择器中[attr="value"]和[attr*="value"]是最实用的 [attr="value"]能帮我们定位不同类型的元素,特别是表单form元素的操作,比如说input[type="text"],input[type="checkbox"]等 [attr*="value"]能在网站中帮助我们匹配不同类型的文件 <!DOCTYPE html> <

  • jquery 中toggle的2种用法详解(推荐)

    一.在元素的click事件中绑定两个或两个以上的函数  toggle不像bind需要在后面添加"click"来绑定click触发事件,toggle本身就是click触发的(而且只能click触发), 如下实例: <input id="btntest" type="button" value="点一下我" /> <div>我是动态显示的</div> <script type="

  • Java对象数组定义与用法详解

    本文实例讲述了Java对象数组定义与用法.分享给大家供大家参考,具体如下: 所谓的对象数组,就是指包含了一组相关的对象,但是在对象数组的使用中一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据类型,所以数组里面的每一个对象都是null值,则在使用的时候数组中的每一个对象必须分别进行实例化操作. 对象数组的声明 先定义,再开辟空间 类名称 对象数组名[] = null; 对象数组名 = new 类名称[长度]; 定义并开辟数组 类名称 对象数组名[] = new 类名称[长度]; 在声明对

  • jQuery日程管理控件glDatePicker用法详解

    本文实例讲述了jQuery日程管理控件glDatePicker用法.分享给大家供大家参考,具体如下: 之前接触过一款日程管理控件,叫 FullCalendar,功能很强大,会列出每天的事项,可选择编辑并且可以定制自己的日历,然而,有时候,我们的网页上只需要一个简单的日历,迷你但实用,有日程安排的日期高亮显示,可跳转日期,可选择日期等等基本功能都应该具备,而这时 FullCalendar 就显得太过庞大了,所以,就有了我对 glDatePicker 控件的学习. 先看效果:    橘红色表示当前选

  • jQuery Chart图表制作组件Highcharts用法详解

    本文实例讲述了jQuery Chart图表制作组件Highcharts用法.分享给大家供大家参考,具体如下: Highcharts是一个制作图表的纯Javascript类库,主要特性如下: ① 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: ② 对个人用户完全免费: ③ 纯JS,无BS: ④ 支持大部分的图表类型:直线图,曲线图.区域图.区域曲线图.柱状图.饼装图.散布图: ⑤ 跨语言:不管是PHP.Asp.net还是Java都可以使用,它只需要三个文件:一个是Highchar

  • jquery组件WebUploader文件上传用法详解

    WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件,下文来为各位演示一下关于jquery WebUploader文件上传组件的用法. 使用WebUploader还可以批量上传文件.支持缩略图等等众多参数选项可设置,以及多个事件方法可调用,你可以随心所欲的定制你要的上传组件. 接下来我以图片上传实例,给大家讲解如何使用WebUploader. HTML 我们首先将css和相关js文件加载. <link rel="s

  • Jquery回调对象与延迟对象用法详解

    目录 一.回调对象Callbacks 1.定义和用法 2.支持的 Flags 参数 3.方法清单: 二.延迟对象:deferred 1.$.Deferred()定义和用法 2.deferred.promise(): 3..promise(): 4.jQuery.when(): 5.方法清单: 一.回调对象Callbacks jQuery 1.7 版本中新增的 jQuery.Callbacks() 函数,返回一个多功能对象,此对象提供了一种强大的方法来管理回调列表.它能够增加.删除.触发.禁用回调

  • nodejs 全局变量和全局对象知识点及用法详解

    1.全局对象 所有模块都可以调用 1)global:表示Node所在的全局环境,类似于浏览器中的window对象. 2)process:指向Node内置的process模块,允许开发者与当前进程互动. 例如你在DOS或终端窗口直接输入node,就会进入NODE的命令行方式(REPL环境).退出要退出的话,可以输入 process.exit(); 3)console:指向Node内置的console模块,提供命令行环境中的标准输入.标准输出功能. 通常是写console.log(),无须多言 2.

  • Jquery $when done then的用法详解

    对于$.ajax请求来说,如果层级比较多,程序看起来会比较乱,而为了解决这种问题,才有了$when...done...fail...then的封装,它将$.ajax这嵌套结构转成了顺序平行的结果,向下面的$.ajax写法,看起来很乱 $.ajax({ url: "/home/GetProduct", dataType: "JSON", type: "GET", success: function (data) { $.ajax({ url: &q

  • PHP回调函数及匿名函数概念与用法详解

    本文实例讲述了PHP回调函数及匿名函数概念与用法.分享给大家供大家参考,具体如下: 1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在php调用回调函数,不想c以及java那样直接使用函数名作为函数参数,而是在php中使用函数对应的字符串名称执行 1.1.无参数回调 <?php //无参数回调 function callback(){ echo 'ex

随机推荐