3

私はJavaScriptのすべての複雑さに比較的慣れていないので、おそらくこのタイミングの問題は、イベント処理のために有効なJavaScriptをプログラムする方法を理解していないだけです.

1 つのページで 2 つの SignalR ハブを使用しています。1 つはチャット ハブで、常に 100% 機能します。もう1つはいくつかのRaphael jsオブジェクトで使用されており、私が問題を抱えているものです。

ラファエル サークル オブジェクトの 1 つにクリック イベントがあり、画面がロードされた直後にそれをクリックすると、C# ハブ メソッドが呼び出されません。これが発生すると、Chrome の開発ツールのコンソールに「SignalR: データを送信する前に接続を開始する必要があります。.sent() の前に .start() を呼び出します」 ハブ cs メソッドを呼び出す JavaScript イベントは常に呼び出されます。奇妙なことに、数秒待つと、cs ハブ メソッドが常に期待どおりに動作するように見えます。ハブ イベントを読み込むのに数秒かかるようです。他の誰かがこのタイプのシナリオに遭遇したことがありますか?

$(document).ready(function() {...にjsコードがありますが、jsコードが実行されるまでRaphael 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();
});
4

1 に答える 1

5

SignalR 接続と対話するハンドラーのワイヤアップを、start メソッドにパラメーターとして渡すコールバック関数に移動する必要があります。これにより、ハブ接続が開始されるまでハンドラーがアクティブにならないことが保証されます。コールバックが実行されるまで UI を少し変更することもできます。たとえば、デフォルトでボタンを無効にし、ハンドラーが接続された後にのみ有効にするなどです。

例えば:

$.connection.hub.start(function() { // ハンドラーを接続し、ここで UI を有効にします });

于 2011-12-18T22:13:18.320 に答える