SignalR完成事件过早触发

时间:2013-06-13 11:38:45

标签: signalr

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();
}

然而直接调用Done(我认为它实际上与启动函数同步调用),当第一条消息发送时,我得到上面的消息

解决方案:

我发现了问题,我们正在使用MVC4捆绑,部署脚本在部署之前不会清除目标区域。因此,scripts文件夹中有多个版本的signalR,捆绑框架将它们全部加载。 :D修复部署脚本后,事情按原样运行

1 个答案:

答案 0 :(得分:1)

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

所以我如何修复你的问题(如果你不想等待下一个版本)将在你的Proxy对象中我将更改连接起始行:

$.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();

通过这种方式,您可以保护您的图书馆免受被称为“开始”的用户的攻击,并且只有在连接时才开始发送。