我对javascript的所有复杂性都比较陌生,所以这个时间问题可能就是我缺乏对如何编写有效的javascript进行事件处理的理解。
我在一个页面上使用了两个SignalR集线器。一个是聊天中心,它可以100%的时间工作。另一个与一些Raphael js对象一起使用,这是我遇到的问题。
我在其中一个raphael圈子对象上有一个点击事件,当我在加载屏幕后不久点击它时,我的C#hub方法没有被调用。当发生这种情况时,Chrome开发工具控制台中的错误是“SignalR:必须先启动连接才能发送数据。在.sent()之前调用.start()“始终调用调用hub cs方法的javascript事件。奇怪的是,当我等待几秒钟时,cs hub方法似乎总是按预期工作。这就像加载集线器事件需要几秒钟。有没有其他人遇到过这种情况?
我在$(document).ready(function(){...中确实有我的js代码但是我猜这是因为Raphael js对象在js代码运行之前不是dom的一部分,它会不要强迫他们加载。
$(document).ready(function() {
var clientHub = $.connection.tableHub;
var canvas = Raphael((innerWidth / 2) + 83, (innerHeight / 2) - 194, 74, 74);
var circle1 = seat1Canvas.circle(37, 37, 35);
var circle1Text = seat1Canvas.text(37, 37, "Open");
var buildCircleAndSendToClients = function() {
clientHub.buildCircle(identity.Name);
};
var drawAvailableCircle = function() {
circle1 = seat1Canvas.circle(37, 37, 35);
circle1Text = seat1Canvas.text(37, 37, "Sit\nHere");
circle1.attr("fill", "#fffeee");
circle1.attr("stroke", "black");
circle1.attr("stroke-width", 3);
circle1.mousedown(buildCircleAndSendToClients);
};
circle1.attr("fill", "#eeefff");
circle1.attr("stroke", "black");
circle1.attr("stroke-width", 3);
circle1.mouseover(drawAvailableCircle);
clientHub.drawCircle = function(username) {
circle1 = seat1Canvas.circle(37, 37, 35);
circle1Text = seat1Canvas.text(37, 37, username);
circle1.attr("fill", "#eeefff");
circle1.attr("stroke", "black");
circle1.attr("stroke-width", 3);
};
$.connection.hub.start();
});
答案 0 :(得分:5)
您需要将与SignalR连接交互的处理程序的连线移动到您作为参数传递给start方法的回调函数。这将确保处理程序在集线器连接启动之前不处于活动状态。您可能希望稍微更改UI,直到该回调运行,例如,默认情况下禁用按钮,并且只有在处理程序连接后才启用它们。
E.g:
$。connection.hub.start(function(){ //连线处理程序并在此处启用UI });