【问题标题】:How to add multiple callbacks to a javascript method?如何向 javascript 方法添加多个回调?
【发布时间】:2012-12-30 18:48:54
【问题描述】:

我使用“函数”技术创建了一个简单的 javascript 类。 在课堂上,我有一个 websocket 侦听器,它在收到特定消息时触发一个函数。 我可以很容易地给它添加一个外部回调,如下

function MyClass() {
    self = this; // to access main object from methods

    // websocket definition

    function websocketMessageInterpreter(message){
       if(message == "Hello!")  onHelloMessageBase();
     }

    function onHelloMessageBase(param){

    // call user defined callback
    self.userDefinedCallback(param);
    }
    this.userDefinedCallback= function(param){}; //default empty callback
}

在外部我使用它作为

var myObject = new MyClass();
myObject.userDefinedCallback = function(){alert("Someone said hello!");};

有没有一个模型可以让我做这样的事情?

myObject.userDefinedCallback += function1;
myObject.userDefinedCallback += function2;

也许以后

myObject.userDefinedCallback -= function1;

【问题讨论】:

标签: javascript jquery callback


【解决方案1】:

执行此操作的常用方法是使用一组回调,以及 addCallback(callback) 和 removeCallback(callback) 等方法,让 API 的用户添加和删除回调。

addCallback 基本上是:

function addCallback(callback) {
    if (this.callbacks.indexOf(callback) < 0) {
        this.callbacks.push(callback);
    }
}

removeCallback 基本上是:

function removeCallback(callback) {
    var index;
    if ((index = this.callbacks.indexOf(callback)) >= 0) {
        this.callbacks.splice(index, 1);
    }
}

如果您需要支持像 IE6 这样可能没有Array#indexOf 的非常老的浏览器,由于您使用的是 jQuery,您可以改用jQuery.inArray。

【讨论】:

  • toString() 是否应用于函数,或者如果它们相同,您如何实际比较两个函数?
  • @Amberlamps:这是一个简单的身份比较,就像任何其他对象一样。
  • @FelixKling:好的,身份比较也适用于匿名函数?
  • @Amberlamps:是的......匿名函数也只是对象。它完全独立于函数是否有名称。
  • 非常有趣的解决方案。我正在对其进行测试并获得应得的认可
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多