SignalR 在我的开发机器和我们的开发测试服务器上运行良好,但是当我将其部署到我们的验收测试机器(应该与开发测试机器配置相同)时,我得到一个
Uncaught Error: SignalR: Connection has not been fully initialized. Use .start().done() or .start().fail() to run logic after the connection has started.
我也跟踪了这个问题,即在连接实际准备好使用之前,signalR 过早调用完成函数
有人遇到同样的问题吗?
相关代码,处理所有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捆绑,并且部署脚本在部署之前没有清除目标区域。因此,脚本文件夹中有多个版本的 signalR,并且捆绑框架会加载所有版本。 :D 修复部署脚本后,一切正常工作
最佳答案
此问题已在 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”的用户的影响,并且仅在连接时才开始发送。
关于SignalR 完成事件触发得太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086124/