3

SignalR 在我的开发机器和我们的开发测试服务器上运行良好,但是当我将它部署到我们的验收测试机器(应该与开发测试机器相同的配置)时,我得到一个

未捕获的错误:SignalR:连接尚未完全初始化。连接开始后,使用 .start().done() 或 .start().fail() 运行逻辑。

我也跟踪了问题,即在连接实际准备好使用之前,signalR 过早调用 done 函数

有没有人有同样的问题?

完整代码可以在这里找到 https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/blob/master/SignalR.EventAggregatorProxy.Client.JS/jquery.signalR.eventAggregator.js

相关代码,处理所有 SignalR 通信的类的构造函数

var Proxy = function (eventAggregator) {
    this.eventAggregator = eventAggregator;

    this.hub = $.connection.eventAggregatorProxyHub;
    this.hub.client.onEvent = this.onEvent.bind(this);
    this.queueSubscriptions = true;
    this.queuedSubscriptions = [];
    $.connection.hub.start().done(this.onStarted.bind(this));
};

我将所有呼叫排队,直到调用完成

onStarted: function () {
    this.queueSubscriptions = false;
    this.sendSubscribeQueue();
}

但是直接调用完成(我认为它实际上与启动函数同步调用),当发送第一条消息时,我得到上述消息

解决方案:

我发现了问题,我们使用的是MVC4捆绑,部署脚本在部署前没有清除目标区域。因此,scripts 文件夹中有多个版本的 signalR,并且捆绑框架会全部加载它们。:D 修复部署脚本后,一切正常

4

1 回答 1

1

这已在 SignalR 的下一个版本中修复。问题的原因是多次调用 start 导致延迟对象立即解决。

我将如何解决您的问题(如果您不想等待下一个版本)将在您的代理对象中,我将更改连接开始行:

$.connection.hub.stateChanged(function(state) {
    // Transitioning from connecting to connected
    if(state.oldState === $.signalR.connectionState.connecting && state.newState === $.signalR.connectionState.connected) {
        // Start sending
    }
});

$.connection.hub.start();

通过这种方式,您可以保护您的库免受名为“starts”的用户的影响,并且只有在连接时才开始发送。

于 2013-06-13T17:52:48.830 回答