在SignalR集线器中使用jquery回调而不是RPC

Use jquery callback instead of RPC in SignalR hub

本文关键字:回调 RPC jquery SignalR 集线器      更新时间:2023-09-26

我需要从不同的地方多次订阅同一个集线器,例如:

function firstPlace(targetHub){
  targetHub.client.onSomeEvent = function(data){
     alert('hello from first place');
  };
}
function secondPlace(targetHub){
  targetHub.client.onSomeEvent = function(data){
     alert('hello from second place');
  };
}
firstPlace($.connection.clientHub);
secondPlace($.connection.clientHub);

我希望拥有基于回调的功能(比如jquery回调)。

function firstPlace(targetHub){
  targetHub.client.onSomeEvent.add(function(data){
     alert('hello from first place');
  });
}
function secondPlace(targetHub){
  targetHub.client.onSomeEvent.add(function(data){
     alert('hello from second place');
  });
}

firstPlace($.connection.clientHub);
secondPlace($.connection.clientHub);

我知道使用一些代理对象可以很容易地实现它,但也许还有一些我不知道的javascript魔力?

您可以像一样使用我的EventAggregator代理

function firstPlace() {
   signalR.eventAggregator.subscribe(MyApp.SomeEvent, this.onSomeEvent, this);
}
function secondPlace() {
   signalR.eventAggregator.subscribe(MyApp.SomeEvent, this.onSomeEvent, this);
}

当然,图书馆有更多的特色,但这是之一

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

如果你不帮助自己,其他人也不会=)。这是解决我问题的代码:

signalR.FunctionToCallback = new function() {
  self.MapCallback = function (sourceFunction, targetCallback) {
      if (!sourceFunction) {
          sourceFunction = function () {
              sourceFunction.callbacks.fireWith(this, $.makeArray(arguments));
          };
      }
      if (!sourceFunction.callbacks) {
          sourceFunction.callbacks = $.Callbacks();
      }
      sourceFunction.callbacks.add(targetCallback);
      return sourceFunction;
  };
};

用法示例:

function firstPlace(targetHub){
  targetHub.client.onSomeEvent = ko.FunctionToCallback.MapCallback(targetHub.client.onSomeEvent,function(data){
     alert('hello from first place');
  });
}
function secondPlace(targetHub){
  targetHub.client.onSomeEvent = ko.FunctionToCallback.MapCallback(targetHub.client.onSomeEvent, function(data){
     alert('hello from second place');
  });
}
firstPlace($.connection.clientHub);
secondPlace($.connection.clientHub);