Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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
Angularjs 快速连续调用$rootScope.$apply()时,$digest已在进行中_Angularjs_Events_Location_Rootscope_Angularjs Digest - Fatal编程技术网

Angularjs 快速连续调用$rootScope.$apply()时,$digest已在进行中

Angularjs 快速连续调用$rootScope.$apply()时,$digest已在进行中,angularjs,events,location,rootscope,angularjs-digest,Angularjs,Events,Location,Rootscope,Angularjs Digest,所以我有一个AngularJS服务来监听一些事件。在处理这些事件时,我需要调用不同的控制器,并最终加载一个新视图。在一个事件处理程序中,我使用$location.path()然后调用$rootScope.apply()来触发到控制器的路由。对于该事件,这可以正常工作,但在其他事件中,我会遇到以下错误:$rootScope:inprog操作已在进行中。我猜它在第一个场景中是有效的,因为$rootScope.apply()是从侦听器函数中的另一个回调函数调用的,而其他处理程序只是从事件侦听器函数调用

所以我有一个AngularJS服务来监听一些事件。在处理这些事件时,我需要调用不同的控制器,并最终加载一个新视图。在一个事件处理程序中,我使用$location.path()然后调用$rootScope.apply()来触发到控制器的路由。对于该事件,这可以正常工作,但在其他事件中,我会遇到以下错误:
$rootScope:inprog操作已在进行中
。我猜它在第一个场景中是有效的,因为$rootScope.apply()是从侦听器函数中的另一个回调函数调用的,而其他处理程序只是从事件侦听器函数调用它

//angular service

$rootScope.$on('MY_EVENT', function (event, msg) {
    MyClass.doSomething(msg, function (response) {
        $location.path("/view1");
        $rootScope.$apply();        //WORKS FINE
    });
});


$rootScope.$on('MY_OTHER_EVENT', function (event, msg) {
    $location.path("/view2");
    $rootScope.$apply();           //ERROR
});
如何使其适用于所有事件处理程序


问题在于,它在
$rootScope
上连续快速执行了两次
$digest
,当出现重叠时会抛出错误。为了解决这个问题,您可以简单地将对
$location.path()
的两个调用包装在
$timeout
中,就像您在plnkr示例中第一次做的那样。这将迫使它等待
$digest
循环完成

您还可以删除对
$rootScope.$apply()
的显式调用

注意:

此代码基于plnkr示例,与原始文章中的代码略有不同

参考资料:


我试过了,但运气不好。路由在任何时候都不会触发。您可以创建一个示例JSFIDLE或plunkr吗?当然可以。在我这么做之前,我还要提到,我的\u事件总是在我的\u其他\u事件之前触发。两个事件之间的时间不确定。确定。我认为,如果你能创建一个复制这一点的示例,它将帮助我/其他人识别问题。
$rootScope.$on('FIRST_EVENT', function(event, msg) {
  $timeout(function() {
    $location.path("/view1");
  });
});

$rootScope.$on('SECOND_EVENT', function(event, msg) {
  $timeout(function() {
    $location.path("/view2");
  });
});