可能是对工厂工作原理的根本误解



我正在尝试编写一个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套接字试图重新连接-所以我知道连接对象-数据流没有被破坏。

我知道$websocket正在工作,因为如果我在控制器中为我所在的视图创建一个web套接字,它会完美地工作并且onMessage被接收。

我似乎不明白的是如何将其推入与视图无关的工厂。

我很感激你的建议。

谢谢

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

听起来你没有在你想要使用它的地方注入工厂。你想在其中使用它的控制器应该看起来像:

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

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

相关内容

  • 没有找到相关文章

最新更新