Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是不是$broadcast和$on都很贵?_Javascript_Angularjs_Events_Javascript Events_Broadcast - Fatal编程技术网

Javascript 是不是$broadcast和$on都很贵?

Javascript 是不是$broadcast和$on都很贵?,javascript,angularjs,events,javascript-events,broadcast,Javascript,Angularjs,Events,Javascript Events,Broadcast,我被告知使用角度事件可能会很昂贵(我无法验证这一点) 对$broadcast和$on的任何调用都应使用工厂或服务进行“包装”,以便注入相应的组件以保持性能 同样,我宁愿使用上的$并直接侦听正在触发的事件,而不是创建一个工厂,它本质上只是注册函数,以便在接收到事件时调用——让我们将其称为dispatcher 请注意,不仅仅是一个组件(指令)监听“某个事件”,还会有多种组件监听此事件 示例调度器: angular.module('app').factory('dispatcher', ['$root

我被告知使用角度事件可能会很昂贵(我无法验证这一点)

$broadcast
$on
的任何调用都应使用工厂或服务进行“包装”,以便注入相应的组件以保持性能

同样,我宁愿使用上的
$并直接侦听正在触发的事件,而不是创建一个工厂,它本质上只是注册函数,以便在接收到事件时调用——让我们将其称为dispatcher

请注意,不仅仅是一个组件(指令)监听“某个事件”,还会有多种组件监听此事件

示例调度器:

angular.module('app').factory('dispatcher', ['$rootScope', function ($rootScope) {

    var registeredFns = [ ];

    $rootScope.$on('some-event', function (evt, msg) { 
        _.each(registeredFns, function (fn) {
            fn.apply(null, msg);
        });
    });

    return {
        onSomeEvent: function (fn) {
            registeredFns.push(fn);
        }
    };
});

然后在我需要的地方注入它-可能是一个指令,可能是一个控制器,只要它不重要。

它们一点都不贵。。。但是如果它们被误用的话,可能会花很多钱(就像生活中的其他事情一样——这听起来像是一个好笑话的开始!)

了解这里实际发生了什么是很重要的,而且这个过程实际上非常简单。如果调用$emit(),它只在已注册的侦听器数组中执行
for()
循环,并调用每个侦听器。它在您首先调用它的作用域上执行此操作,然后“向上”每个父级,直到它到达$rootScope

这里有一点额外的代码来处理stopPropagation之类的事情,但除此之外就是这样

$broadcast执行类似的操作,但方向相反:它执行for()循环,然后遍历每个作用域。这是一个非常重要的区别,因为如果你做一个
$rootScope.$broadcast()
,并且你有大量的ngrepeat和指令,你可能要做的工作比你预期的多得多-即使这些作用域中没有一个监听这个事件,Angular仍然需要遍历它们才能弄清楚这一点


如果您想在jsPerf或类似软件中进行尽可能快的测试,最快的用例是使用
$rootScope.$emit()
$rootScope.$on()
。这将为基本消息传递提供一个单一范围的测试,您可以从那里开始。

创建一个性能测试并更新您发现的内容服务将确保您以一种惰性的方式添加侦听器;所以你只在需要的时候听。但我不担心这个。过早优化。解释得很清楚。但是,我想知道在哪种情况下,使用$rootScope.$broadcast()+$scope.$on会比使用$rootScope.$emit()+$rootScope.$on()更好(更合适)