何时使用JQuery.Callbacks?

何时使用JQuery.Callbacks?,jquery,jquery-callback,jquery-1.7,Jquery,Jquery Callback,Jquery 1.7,我查看了添加到jQuery1.7的新内容,发现它们现在有jQuery.Callbacks() 文档向您展示了如何使用jQuery.callbacks(),但没有任何我想使用它们的适用示例 似乎可以从回调列表中添加/删除回调,也可以执行jQuery.callbacks().fire(args),但这只会触发该列表中的所有回调。也许我遗漏了什么,但这似乎不是很有用 在我的脑海中,当我第一次看到这个新功能时,我认为您可以将它与键/值对一起使用。这将提供一种在应用程序中的单个位置管理回调函数的简单方法。

我查看了添加到jQuery1.7的新内容,发现它们现在有jQuery.Callbacks()

文档向您展示了如何使用jQuery.callbacks(),但没有任何我想使用它们的适用示例

似乎可以从回调列表中添加/删除回调,也可以执行jQuery.callbacks().fire(args),但这只会触发该列表中的所有回调。也许我遗漏了什么,但这似乎不是很有用

在我的脑海中,当我第一次看到这个新功能时,我认为您可以将它与键/值对一起使用。这将提供一种在应用程序中的单个位置管理回调函数的简单方法。差不多

$.callbacks.add("foo", myFunction);
$.callbacks().fire("foo", args);
例如,如果我想在函数末尾调用回调函数,我可以做如下操作

$.callbacks.add("foo", myFunction);
$.callbacks().fire("foo", args);
然而,看起来您无法启动特定的回调,您只能使用给定的参数启动所有回调,或者不启动任何回调

我所看到的最接近的一件事是能够为.fire()函数提供一个上下文来设置“this”属性

.fireWith(context, args)
但这也没什么帮助

  • 我是否误解了文档?

  • 如果这是所需的功能,有哪些有用的适用示例。


  • 我没有看到任何关于设置上下文的具体内容,但由于您可以传递任意数量的参数,这可能会很有用。您还可以制定自己的约定,将标志作为第一个参数传递,如果侦听器不打算处理剩余的参数列表,则让侦听器立即返回false

    我遇到过这样的情况,类似的内容可能很有用,但却将bind()和trigger()用于自定义事件。想象一下,在某个消息处理系统(基于web的聊天室或电子邮件客户端)中,您正在轮询新消息的服务。其中一个功能可能是在某个范围内设置一个数字,或者在发生某些事情时显示一声咆哮。另一个可能是更新网格。使用触发器,您必须为每个侦听器触发事件,并从eventData“展开”传递的参数,使用回调,只需一次触发,并且您的侦听器是带有简单参数列表的简单javascript函数


    回调并不完全是革命性的,但它将使代码变得更少、更干净。

    我正在开发一个包含大量业务逻辑和至少11个外部服务的应用程序。如果您可以使用回调之类的方法编写自己的流控制类和行为,而不是试图将自己的意愿强加给延迟的实现,那么这确实有助于保持事情的直截了当。

    当您使用相同的方法更新不同的DOM元素时,回调非常有用

    下面是一个俗气的例子:


    当你点击某个东西时,它会更新点击计数器和“上次点击”按钮。

    似乎
    $。回调开始于一个实现细节:一种管理函数列表并使用相同参数调用给定列表中所有函数的方法。有点像C#,具有附加功能,例如可以传递的标志,以自定义列表的行为

    一个很好的例子可能是jQuery在内部使用
    $.Callbacks
    来实现它的
    ready
    事件<代码>bindReady()
    初始化回调列表:

    readyList = jQuery.Callbacks( "once memory" );
    
    请注意
    once
    memory
    标志,它们确保回调列表只被调用一次,并且在调用列表后添加的函数将立即被调用

    然后,
    ready()
    将指定的处理程序添加到该列表中:

    ready: function( fn ) {
        // Attach the listeners
        jQuery.bindReady();
    
        // Add the callback
        readyList.add( fn );
    
        return this;
    }
    
    最后,在DOM就绪时触发回调列表:

    readyList.fireWith( document, [ jQuery ] );
    
    所有
    ready
    处理程序都是在同一文档的上下文中调用的,该文档对全局jQuery对象具有相同的引用。它们只能被调用一次,从那时起,传递给
    ready()
    的附加处理程序将立即被调用,所有这些都是
    $提供的。回调

    以进一步展开并消除一些混淆:

    可能需要使用jQuery的
    $.Callbacks
    的原因是多方面的:

  • 用户在一个函数中包含大量代码,并希望将其拆分
  • 他们获取这些信息并通过jQuery回调函数发送,该函数允许他们将代码拆分为更好管理的部分,以便使用。
    所以(例如)如果你看:

  • 您现在可以拥有多个回调批处理的函数,您现在可以在认为必要时调用这些函数,而无需在整个代码中进行如此多的更改
  • 一个(几乎)开箱即用的jQuery发布/订阅系统 这是IMHO最有趣的应用程序,由于答案中没有明确说明(尽管有些人确实提到了用法),我将其添加到这篇相对古老的文章中

    NB:该用法在中有明确说明,并附有示例,但我猜它是在问题发布后添加的

    又名观察者模式,是一种促进应用程序中松散耦合和单一责任的模式。对象不是直接调用其他对象的方法,而是订阅特定的任务或活动,并在其发生时收到通知。有关使用发布/订阅模式的好处的更详细的说明,您可以查看

    当然,使用
    trigger
    .on()
    .off()
    ,但是我发现
    jQuery.Callbacks
    更适合任务,生成更干净的代码

    以下是来自的示例代码段:

    以及一个使用示例:

    // Subscribers
    $.Topic( "mailArrived" ).subscribe( fn1 );
    $.Topic( "mailArrived" ).subscribe( fn2 );
    $.Topic( "mailSent" ).subscribe( fn1 );
     
    // Publisher
    $.Topic( "mailArrived" ).publish( "hello world!" );
    $.Topic( "mailSent" ).publish( "woo! mail!" );
     
    // Here, "hello world!" gets pushed to fn1 and fn2
    // when the "mailArrived" notification is published
    // with "woo! mail!" also being pushed to fn1 when
    // the "mailSent" notification is published.
     
    /*
    output:
    hello world!
    fn2 says: hello world!
    woo! mail!
    */
    

    我理解,只要您只有一个地方需要调用所有回调,就可以使用此功能。但在web应用程序中,情况几乎从未如此。大部分
    // Subscribers
    $.Topic( "mailArrived" ).subscribe( fn1 );
    $.Topic( "mailArrived" ).subscribe( fn2 );
    $.Topic( "mailSent" ).subscribe( fn1 );
     
    // Publisher
    $.Topic( "mailArrived" ).publish( "hello world!" );
    $.Topic( "mailSent" ).publish( "woo! mail!" );
     
    // Here, "hello world!" gets pushed to fn1 and fn2
    // when the "mailArrived" notification is published
    // with "woo! mail!" also being pushed to fn1 when
    // the "mailSent" notification is published.
     
    /*
    output:
    hello world!
    fn2 says: hello world!
    woo! mail!
    */