Javascript Angular.js服务工厂模块…是否将内部代码作为函数返回?

Javascript Angular.js服务工厂模块…是否将内部代码作为函数返回?,javascript,angularjs,Javascript,Angularjs,我是angular.js的新手。这是我写的第一个服务。它接受一个json对象并更新控制器的作用域。不过我有点困惑…我想我应该包装SSEStener的内部代码并将其作为函数返回,但我不确定我将如何编写它,以及为什么需要将其作为函数返回 另外,如果我将此服务注入多个控制器,会增加事件侦听器吗?我只想要一个事件侦听器 one@demo ~/cloudimageshare-monitoring/project/app/scripts $ cat services/sse_listen.js angul

我是angular.js的新手。这是我写的第一个服务。它接受一个json对象并更新控制器的作用域。不过我有点困惑…我想我应该包装SSEStener的内部代码并将其作为函数返回,但我不确定我将如何编写它,以及为什么需要将其作为函数返回

另外,如果我将此服务注入多个控制器,会增加事件侦听器吗?我只想要一个事件侦听器

one@demo ~/cloudimageshare-monitoring/project/app/scripts $ cat services/sse_listen.js 
angular.module('monitorApp')
.factory('sseListener', function () {
    var source = new EventSource('/subscribe');

    source.addEventListener('message', function(e) {
        var result = JSON.parse(e.data);
         event = Object.keys(result)[0];
         switch(event) {
             case "cpuResult":
                 cpuUpdate(result);
             break;
         }
    });
}


与其直接调用cpuUpdate(我不清楚您的工厂如何获得此函数的引用),不如使用$rootScope.$broadcast(eventName,data),并对控制器中的事件做出反应。此外,您应该从工厂返回一个对象,但由于您不需要将其注入任何地方,因此最好将其放入app.run。下面是我认为您的代码应该如何处理我提到的更改:

angular.module('monitorApp').
    run(function ($rootScope) { //Inject the $rootScope
        var source = new EventSource('/subscribe');

        source.addEventListener('message', function(e) {
            var result = JSON.parse(e.data);
             event = Object.keys(result)[0];
             switch(event) {
                 case "cpuResult":
                     // Broadcast the event with data
                     $rootScope.$broadcast('$cpuResult', result);
                 break;
             }
        });
    }).
    controller('cpuCtrl', function($scope)){
        $scope.apiTimeStamp = "";
        $scope.infoReceived = "";
        $scope.last15 = "";
        $scope.last5 = "";
        $scope.lastMinute = "";

        // Need to pass the event to cpuUpdate,
        var cpuUpdate = function (e, result) { 
            $scope.$apply(function(){
                $scope.apiTimeStamp = result.cpuResult.timestamp;
                $scope.infoReceived = new Date();
                $scope.last15 = result.cpuResult.metrics['1m'].data
                $scope.last5 = result.cpuResult.metrics['5m'].data
                $scope.lastMinute = result.cpuResult.metrics['15'].data
            });
        };

        //Listen for the event, call cpuUpdate when caught
        $scope.$on('$cpuResult', cpuUpdate);
    });

这是从我的工厂退回一件物品吗?我在sseListenerWhoops中没有看到返回函数名,我忘记了那个部分,我会修复它。哦…好的…我不想返回
var source=new EventSource('/subscribe')
source.addEventListener('message',function(e){}
?如果否,原因是什么?您只需要返回一个对象,该对象公开您希望通过注入工厂访问的成员。您可能希望返回{'source':source}因此,您可以检查事件侦听器的状态。事实上,仔细想想,由于您没有在任何地方注入此代码,我认为最好将此代码放在app.run中,而不是放在工厂中。我已相应地修改了代码。
angular.module('monitorApp').
    run(function ($rootScope) { //Inject the $rootScope
        var source = new EventSource('/subscribe');

        source.addEventListener('message', function(e) {
            var result = JSON.parse(e.data);
             event = Object.keys(result)[0];
             switch(event) {
                 case "cpuResult":
                     // Broadcast the event with data
                     $rootScope.$broadcast('$cpuResult', result);
                 break;
             }
        });
    }).
    controller('cpuCtrl', function($scope)){
        $scope.apiTimeStamp = "";
        $scope.infoReceived = "";
        $scope.last15 = "";
        $scope.last5 = "";
        $scope.lastMinute = "";

        // Need to pass the event to cpuUpdate,
        var cpuUpdate = function (e, result) { 
            $scope.$apply(function(){
                $scope.apiTimeStamp = result.cpuResult.timestamp;
                $scope.infoReceived = new Date();
                $scope.last15 = result.cpuResult.metrics['1m'].data
                $scope.last5 = result.cpuResult.metrics['5m'].data
                $scope.lastMinute = result.cpuResult.metrics['15'].data
            });
        };

        //Listen for the event, call cpuUpdate when caught
        $scope.$on('$cpuResult', cpuUpdate);
    });