AngularJS:在服务中重新连接WebSocket

AngularJS: Reconnect WebSocket inside a service

本文关键字:重新连接 WebSocket 服务 AngularJS      更新时间:2023-09-26

我在AngularJS应用程序中使用web套接字。
当用户注销时,客户端关闭web套接字连接。当用户重新登录时,我需要重新连接web套接字。
web套接字包含在一个服务中(代码简化了一点):

angular.module('myApp').factory("SubscriptionFactory", function () {
    var Service = {};
    var ws = new WebSocket("ws://127.0.0.1:8000");
    /* WS methods (onopen, onmessage ect) left out for simplicity */
    Service.reestablishConnection = function() {
        // Reestablishing connection
        ws = new WebSocket("ws://127.0.0.1:8000");
    }
    return Service;

问题是web套接字的新实例不工作。
根据这个问题,web套接字需要在重新创建对象时将其处理程序重新连接到对象。
但是AngularJS的服务是单例的(根据这个问题应该保持单例)。
如何在我的AngularJS单例服务中重新创建web套接字实例?

我自己找到了解决办法。其实很简单:

angular.module('myApp').factory("SubscriptionFactory", function () {
    var Service = {};
    var ws;
    Service.onMessage = function(message) { /* some code */};
    Service.onClose = function() { /* some code */ };
    Service.onOpen = function() { /* some code */};
    Service.onError = function(error) { /* some code */};
    Service.connect = function() {
        // (Re)connect
        ws = new WebSocket("ws://127.0.0.1:8000");
        // Reattaching handlers to object
        ws.onmessage = Service.onMessage;
        ws.onclose = Service.onClose;
        ws.onopen = Service.onOpen;
        ws.onerror = Service.onError;
    }
    return Service;

这里发生的事情很简单:我创建了一个新的Web Socket对象,并手动将Web Sockets处理程序附加到我的AngularJS服务中。