SignalR (с Raphael js) проблема синхронизации $ .connection.hub.start () - PullRequest
3 голосов
/ 15 декабря 2011

Я относительно новичок во всех тонкостях javascript, поэтому, возможно, эта проблема с синхронизацией - просто мое отсутствие понимания того, как программировать допустимый javascript для обработки событий.

У меня есть два концентратора SignalR, которые используются на одной странице. Одним из них является чат-центр, который работает 100% времени. Другой используется с некоторыми объектами Raphael js, и с ним у меня проблемы.

У меня есть событие щелчка по одному из объектов круга Рафаэля, и когда я щелкаю по нему вскоре после загрузки экрана, мой метод C # хаба не вызывается. Когда это происходит, в консоли разработчика Chrome появляется ошибка «SignalR: подключение должно быть установлено до отправки данных. Вызов .start () перед .sent () »Всегда вызывается событие javascript, которое вызывает метод hub cs. Странно то, что, когда я жду несколько секунд, метод cs hub всегда работает так, как ожидалось. Это похоже на загрузку событий концентратора за пару секунд. Кто-нибудь еще сталкивался с таким сценарием?

У меня есть мой js-код в $ (document) .ready (function () {... но я предполагаю, что, поскольку js-объекты Raphael не являются частью dom, пока не будет запущен js-код, будет не заставляйте их загружаться.

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

1 Ответ

5 голосов
/ 19 декабря 2011

Вам нужно переместить соединение для обработчиков, которые будут взаимодействовать с соединением SignalR, в функцию обратного вызова, которую вы передаете в качестве параметра методу start. Это гарантирует, что обработчики не активны, пока не будет запущено соединение с концентратором. Возможно, вы захотите немного изменить пользовательский интерфейс до тех пор, пока не будет запущен этот обратный вызов, например, если кнопки отключены по умолчанию, и включите их только после того, как обработчики подключены.

например:

$. Connection.hub.start (function () { // обработчики проводов и включаем интерфейс здесь });

...