检查是否已经设置了监听器

Check if a listener is already set

我在服务中添加一个监听器如下:

app.service('hostService', ['$rootScope', function ($rootScope) {    
    this.addListener = function () {
        console.log("addListener")
        $rootScope.$on("messageFromSiteToHost", function (event, data) {
            action(data);
        })
    }

然后我意识到hostService.addListener被用户多次调用,结果当有messageFromSiteToHost的消息时,action(data)被多次调用。

有谁知道是否有办法检查 $rootScope.$on("messageFromSiteToHost" 是否已设置(无需在服务中使用辅助变量)。如果已经设置好了,我不想再添加监听器了。

框架中没有任何可用于检查现有事件侦听器的内容。

您能解释一下您要求不使用 "an auxiliary variable in the service" 的原因吗?

为什么不能在函数周围加个守卫?:

app.service('hostService', ['$rootScope', function ($rootScope) {    

    var listenerAdded = false;
    this.addListener = function () {
        if (listenerAdded){
            return;
        }
        listenerAdded = true;

        console.log("addListener")
        $rootScope.$on("messageFromSiteToHost", function (event, data) {
            action(data);
        })
    }

}]);

此外,如果您发现需要在整个应用程序中经常执行此操作,那么您可以概括实现或使用类似 lodash.once 的方法来删除样板文件:

app.service('hostService', ['$rootScope', function ($rootScope) {    

    this.addListener = _.once(function () {
        console.log("addListener")
        $rootScope.$on("messageFromSiteToHost", function (event, data) {
            action(data);
        })
    });

}]);