SignalR连接关闭但在angularjs范围破坏后仍然有效

时间:2017-05-19 21:11:18

标签: asp.net angularjs signalr

我在angularjs工厂中有一个SignalR集线器代理。

var http = require('http');
http.createServer(function(req, res) {
    res.writeHead(200, { 'Content-Type' : 'text/plain'});
    res.end('Hello World!');
}).listen(8080);

我使用连接超时,因为有时服务器不听,所以我可以重试。 我在我的控制器中使用这个工厂:

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;
}]);

但是当我删除我的指令时,signalR仍然有效。

1 个答案:

答案 0 :(得分: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();,但我不知道它是否有一些显着差异。