18

SignalR を使用する小さなプロジェクトがありますが、非常に一貫性のない動作が発生しています。

<script type="text/javascript">
    $(function () {
        var chat = $.connection.brewBattleHub;
        $.connection.hub.start().done(function () {
            $("#broadcast").click(function () {
                // Call the chat method on the server
                chat.server.roll($("#username").val(), $("#drinkname").val());
            });
            chat.server.sendMessage("SignalR loaded...");
        });
    });
</script>

ページをロードすると、「SignalR がロードされました」というメッセージが表示される場合と表示されない場合があります。

ページには他にもいくつかの機能があり、これも機能しないことがあります。ボタンをクリックして物事を十分に実現すると、最終的にはすべてが一度に実行されます...この時点から、すべてがゴールデンで完全に機能します。

ですかstart().done()?すべての準備が整っていることを確認しませんか?

===補遺、私はjqueryモバイルを参照していません(Googleはそうするとバグがあると述べました)

4

4 に答える 4

15

.done() のコードが実行されなかったことを除いて、今週も同様の問題がありました。ログを有効にしましたが、何もログに記録されませんでした。ブラウザのコンソールを確認したところ、エラーはありませんでした。ブラウザーの開発ツールを見ると、start() を呼び出したときにネットワーク アクティビティがないことがわかりました。$.connection.myhubclass によって返されたプロキシにすべてのメソッドが含まれていることを確認したので、サーバーと通信できることと、サーバー側のコードが正しく設定されていることがわかりました。

コードとドキュメントを何度も見直した後、私は何も悪いことをしていないと確信しました。SignalR は非常に単純なので、例に従えば、間違ったことをするのはかなり困難です。私はこれを理解しようとして、かなり長い間机の上で頭を打ちました。

その後、コンソールから SignalR の start メソッドを実行すると、機能することに気付きました。そのため、接続を開始しようとしているのが早すぎると思いました。初期化コードを次から変更することで問題を解決しました。

$.connection.hub.start().done(function () {
  //Do interesting stuff
});

これに:

setTimeout(function () {
    $.connection.hub.start().done(function () {
      //Do interesting stuff
    });
}, 5000);

その遅延を 5 秒からそれよりも短い時間に短縮できると確信していますが、余分な時間は、ブラウザが接続を作成する準備を整えるために必要だったようです。その遅延が発生すると、ログが機能し始め、接続が確立され、サーバー側の OnConnected() が実行され、クライアントで done() が実行されました。

これを理解した後、JavaScript の読み込みの順序を再確認しました。何かを順不同で読み込んでいたのではないかと考えましたが、SignalR サンプルによると順序は正しいです。jQuery、SignalR、/signalr/hubs、そしてすべてを初期化するスクリプト ファイルを読み込みます。

なぜその遅延が必要だったのかについて、私は提案を受け付けています。どのドキュメントにも表示されていないので、私がやったことである可能性があることはわかっています。幸いなことに、このページでは、SignalR を起動する前のわずかな遅延は問題ではありません。

于 2013-06-06T23:21:32.877 に答える
12

SignalRロギングを有効にして、問題のデバッグに役立ててください。fail開始が成功しない場合に備えて、ハンドラーを追加することもできます(これはありそうにありませんが)。これを実行したら、ブラウザのF12ツールを調べて、JSとネットワークログを確認できます。

<script type="text/javascript">
    $(function () {
        $.connection.hub.logging = true;
        var chat = $.connection.brewBattleHub;
        $.connection.hub.start().done(function () {
            $("#broadcast").click(function () {
                // Call the chat method on the server
                chat.server.roll($("#username").val(), $("#drinkname").val());
            });
            chat.server.sendMessage("SignalR loaded...");
        }).fail(function (reason) {
            console.log("SignalR connection failed: " + reason);
        });
    });
</script>
于 2013-03-07T19:15:04.273 に答える
0

切断後に接続を再確立しようとしたときにのみ発生する同様の問題がありました。切断ハンドラから start() を呼び出してから、start.done() からメッセージを送信しようとしました。その後、SignalR の準備ができていないというエラー メッセージが表示されました。

ログで start.done() がすぐに解決したことに気付いたので、私の場合、切断から開始してから送信するための呼び出しがありました。切断ハンドラーに setTimeout を追加して、開始と送信が切断から切り離されるようにしました。これで問題は解決しました。

于 2015-05-02T20:58:34.310 に答える