【问题标题】:Add callbacks in javascript just as in C#就像在 C# 中一样在 javascript 中添加回调
【发布时间】:2018-03-20 15:11:09
【问题描述】:

在 C# 中,我可以执行以下操作:

public delegate void Callback();

void f1() {

}

void f2() {

}

Callback c = f1;
c+=f2;

然后当我调用c() 时,我将调用f1 和f2。

如何在 javascript 中实现相同的结果?

我的意思是我可以在 javascript 中执行以下操作:

var c;

function f1() {

}

function f2() {

}

c = f1;

但我无法将f2 添加到c。

【问题讨论】:

  • 你试过运行代码吗?它就像你问的那样工作
  • @EhsanSajjad,您使用的是什么 javascript 版本?
  • f1 和 f2 异步调用是否返回承诺?
  • @palaѕн,没有。没有异步。
  • @ЯрикТроф 我看错了,所以你在 js 中寻找相同的行为

标签: javascript c# callback delegates


【解决方案1】:
var t = function(callback){
// do stuff
callback();
}

function callbackFuction(){
// this is your callback fucntion
}

function diffrentFuntion(){
   t(callbackFuction);
}

希望这能回答您的问题

【讨论】:

    【解决方案2】:

    不,你不能。 JavaScript 没有 C# 委托的概念。

    使用 jQuery 你可以实现类似但不一样的东西:

    var c = $({});
    
    function a() { console.log('a called!'); }
    
    function b() { console.log('b called!'); }
    
    c.on('fire', a);
    c.on('fire', b);
    
    c.trigger('fire'); // calls both event handlers
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    如果它适合你...

    或者你可以自己实现,很简单:

    function Delegate() {
      this.callbacks = [];
    }
    
    Delegate.prototype.add = function(fn) {
      if (typeof fn === 'function' && this.callbacks.indexOf(fn) === -1) {
        this.callbacks.push(fn);
      }
    };
    
    Delegate.prototype.remove = function(fn) {
      var index = this.callbacks.indexOf(fn);
      this.callbacks.splice(index, 1);
    };
    
    Delegate.prototype.trigger = function() {
      var args = arguments;
      this.callbacks.forEach(function(fn) {
        fn.apply(null, args);
      });
    };
    
    // so
    
    var d = new Delegate();
    
    var f1 = function(arg) { console.log('f1', arg); };
    var f2 = function(arg) { console.log('f2', arg); };
    var f3 = function(arg) { console.log('f3', arg); };
    
    d.add(f1);
    d.add(f2);
    d.add(f3);
    
    d.trigger('param'); // executes the three callbacks passing them the parameter
    
    // remove one of the callbacks;
    d.remove(f2);
    // add a repeated callback
    d.add(f1);
    
    d.trigger('again');  // only f1 and f3 are fired.

    这个 Delegate 类的行为尽可能类似于 C# 委托

    【讨论】:

      【解决方案3】:

      它被称为多播委托,我不确定是否有直接的方法可以在 JavaScript 中表示它。但我发现了这个article on implementing multicast delegates in JavaScript。

      【讨论】:

        【解决方案4】:

        这是另一个例子。这可能会也可能不会满足您的需求,但也许您可以对其进行修改以做您想做的事情。

        基本上,您正在创建一个包含函数引用数组的对象。当你在对象上调用.apply()时,它会按照你添加它们的顺序调用所有函数。

        function delegate(fn){
            this.callbacks = [];
            this.add(fn);
        }
        delegate.prototype.add = function(fn){
            if(typeof fn === "function"){
                this.callbacks.push(fn);
            }
        }
        delegate.prototype.apply = function(){
            for(var i in this.callbacks){
                this.callbacks[i].apply();
            }
        }
        
        
        // example
        
        // define callbacks
        function cb1() { console.log('callback 1'); }
        function cb2() { console.log('callback 2'); }
        
        // create delegate with first callback
        var callback = new delegate(cb1);
        // add second callback
        callback.add(cb2);
        // call delegates
        callback.apply();

        【讨论】:

        • 当然这不是最有效的,但我们在这里谈论的是 2-5 次迭代? for-in 的其他一些故障在这里不适用,因为数组是在此类中创建和填充的。开发人员不能在课堂之外操纵它。我支持在这里使用 for-in,但再看一遍我想我可能会将其更改为 this.callbacks.forEach()。
        猜你喜欢
        • 2011-03-23
        • 2018-06-22
        • 2013-01-16
        • 2012-04-30
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 2011-02-27
        • 2023-03-31
        相关资源
        最近更新 更多