2017-05-19 5 views
0

私はこのようにangularjsファクトリにSignalRハブプロキシを持っています。SignalR接続は閉じていますが、anglejsのスコープ破棄後もまだ動作しています

var app = angular.module('app'); 

app.factory("signalRHubProxy", ['$rootScope', "$timeout", function ($rootScope, $timeout) { 
    function signalRHubProxyFactory(serverUrl, hubName) { 
     var connection = $.hubConnection(serverUrl); 
     var proxy = connection.createHubProxy(hubName); 

     connection.disconnected(function() { 
      $timeout(function() { 
       connection.start(); 
      }, 5000) 
     }); 

     return { 
      on: function (eventName, callback) { 
       proxy.on(eventName, function (result) { 
        $rootScope.$apply(function() { 
         if (callback) { 
          callback(result); 
         } 
        }); 
       }); 

       connection.start(); 
      }, 
      stop: function() { 
       connection.stop(); 
      }, 
      connection: connection 
     }; 
    } 

    return signalRHubProxyFactory; 
}]); 

サーバーがリッスンしないことがあるため、再試行することがあるため、接続タイムアウトを使用しました。 私は私のコントローラで、このファクトリを使用しています:

app.controller("directiveController", function($scope, signalRHubProxy){ 

    var signalRProxy = signalRHubProxy(
      "url", 
      "hubname"); 

    signalRHubProxy.on("datapush", function(data){ 

    }); 

     $scope.$destroy(function(){ 
     signalRHubProxy.stop(); 
     ??? how to kill signalr hub 
     }) 
}) 

しかし、私は私のディレクティブを削除すると、signalRはまだ動作します。

答えて

0

stop()に電話すると、disconnectedイベントが呼び出され、再び接続が開始されます。

app.factory("signalRHubProxy", ['$rootScope', "$timeout", function ($rootScope, $timeout) { 
    function signalRHubProxyFactory(serverUrl, hubName) { 
     var connection = $.hubConnection(serverUrl); 
     var proxy = connection.createHubProxy(hubName); 

     var manualStop = false; 

     connection.connected(function() { 
      manualStop = false; // reset variable if connected 
     }); 

     connection.disconnected(function() { 
      if (manualStop) 
       return; 
      $timeout(function() { 
       connection.start(); 
      }, 5000) 
     }); 

     return { 
      on: function (eventName, callback) { 
       proxy.on(eventName, function (result) { 
        $rootScope.$apply(function() { 
         if (callback) { 
          callback(result); 
         } 
        }); 
       }); 

       connection.start(); 
      }, 
      stop: function() { 
       manualStop = true; 
       connection.stop(); 
      }, 
      connection: connection 
     }; 
    } 

    return signalRHubProxyFactory; 
}]); 

また、$scope.$destroyが呼び出されていることを確認してください:あなたはその後、ちょうど接続の再起動を回避、切断が意図的であれば(簡単なブール変数で)チェックする必要があります。


一部の人々は、私は本当にそれがいくつかの重要な違いがあるかどうか分かりませんが、$.connection.hub.stop();代わりのconnection.stop();を呼び出すことをお勧めします。

関連する問題