工厂如何运作可能存在根本性的误解?

时间:2015-10-06 09:57:05

标签: angularjs websocket

我正在尝试编写一个Angular工厂,它基本上打开一个websocket,监听连接并打印从服务器接收的消息

我用这种方式制作了我的工厂:

angular.module('zmApp.controllers')
.factory('EventServer', 
 [ '$websocket',function 
 ( $websocket) {

    function start()
    {

        console.log("*************FACTORY EVENT SERVER*************");
        var dataStream;
        console.log ("FACTORY webSocketStart: attempting to start a WSS connection");

        dataStream =$websocket("wss://<server>:9000/");


        dataStream.onMessage = function(message) {
            console.log("SERVICE GOT WEBSOCKET MESSAGE:" + message.data);
        };


     return {
         start:start
     };
}])

以下是我的疑惑:

  • 如何确保此工厂“开始”并收到 像它的消息应该与哪个应用程序无关 控制器/视图我在?我曾经假设将这家工厂包括在内 index.html,它会自动被调用。不是这样。即使我在app.run中调用EventServer.start(),我也可以看到套接字初始化和连接,但我从未收到onMessage回调
  • 如果我将“Factory”重命名为“service”,它会在应用程序运行时自动启动但是 当我移动到另一个控制器/视图时,它停止接收消息(与工厂相同)

我的目标是编写一个接收Web套接字消息的工厂。我可能会对如何做到这一点感到困惑,并使其与我的应用程序所处的状态/视图无关。

这是奇怪的部分:如果我启动了带有重新连接选项的Web套接字套接字并且我关闭了服务器,我可以看到Web套接字试图重新连接 - 所以我知道连接对象 - dataStream没有得到销毁。

我知道$ websocket正在运行,因为如果我在一个控制器内为我所在的视图创建一个Web套接字,它可以正常工作并且接收到onMessage。

我似乎无法得到的是如何将其推入独立视图的工厂。

我很感激你的建议。

谢谢

1 个答案:

答案 0 :(得分:0)

工厂是单件,意味着每次将其注入控制器或其他工厂时都会创建一个新实例。

听起来你并没有在你想要使用它的地方注入工厂。您要使用它的控制器应如下所示:

angular
.module('zmApp.controllers')
.controller('YourController', ['EventServer', function(EventServer) {
   EventServer.start // to access the method in your factory
}]);

您需要为要使用EventServer的每个控制器或工厂执行此操作。