我有完全相同的情况。如果您尝试从多个位置调用它,您可能需要考虑添加另一种抽象布局。
这是我想出的初步版本(打字稿)。
我将从用法开始。SignalRManager
是我的“经理”类,它抽象了我的debuggingHub
集线器。我有一个fooChanged
在服务器上触发的客户端方法。
在使用 SignalR 的模块中的某个地方,我只是调用了该start
方法,如果已经启动,则不会重新启动该方法。
// ensure signalR is started
SignalRManager.start().done(() =>
{
$.connection.debuggingHub.server.init();
});
您的“模块”只需通过管理器类注册其回调,并且每当触发 SignalR 客户端方法时,都会调用您的处理程序。
// handler for foo changed
SignalRManager.onFooChanged((guid: string) =>
{
if (this.currentSession().guid == guid)
{
alert('changed');
}
});
这是一个简单的版本,SignalRManager
它使用 jQuery$.Callbacks
将请求传递给尽可能多的模块。当然你可以使用任何你想要的机制,但这似乎是最简单的。
module RR
{
export class SignalRManager
{
// the original promise returned when calling hub.Start
static _start: JQueryPromise<any>;
private static _fooChangedCallback = $.Callbacks();
// add callback for 'fooChanged' callback
static onfooChanged(callback: (guid: string) => any)
{
SignalRManager._fooChangedCallback.add(callback);
}
static start(): JQueryPromise<any>
{
if (!SignalRManager._start)
{
// callback for fooChanged
$.connection.debuggingHub.client.fooChanged = (guid: string) =>
{
console.log('foo Changed ' + guid);
SignalRManager._fooChangedCallback.fire.apply(arguments);
};
// start hub and save the promise returned
SignalRManager._start = $.connection.hub.start().done(() =>
{
console.log('Signal R initialized');
});
}
return SignalRManager._start;
}
}
}
注意:处理断开连接或连接丢失可能需要额外的工作。