首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:$rootScope:inprog --“不”执行$apply的正确方法是什么?

错误:$rootScope:inprog --“不”执行$apply的正确方法是什么?
EN

Stack Overflow用户
提问于 2017-03-21 09:40:08
回答 2查看 1.7K关注 0票数 1

AngularJS Wiki -反模式声明如下:

不要做if (!$scope.$$phase) $scope.$apply(),这意味着您的$scope.$apply()在调用堆栈中不够高。

我能理解这一点。有一个内置的逻辑,它决定什么时候需要执行。当外部开发人员没有在运行时执行不同过程的直接内部代码时,确定应该在哪里运行时,它会抵消框架的影响。

但我目前正在上传一个大文件,上传进度通过进度栏显示。我使用的库(resumableJS)反过来有一个名为fileProgress的事件,在上传过程中调用该事件。如果在该事件中我什么也不做,那么酒吧就不会更新。如果我将$scope.$apply()放在那里,就会相应地更新条形图,但是我得到摘要和/或已在进行中的应用错误。最后,在$$phase检查的帮助下,我获得了两个方面的优势,一个更新的进度条,没有任何错误。

那么,在不干扰角度处理顺序的同时,让我的酒吧更新的正确选择是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-21 09:46:59

在您的示例中,当摘要周期已经处于阶段时,您正在尝试运行摘要周期。所以它抛出了一个错误

您可以使用类似于setTimeout(fn,0)的东西。它主要做的是立即向队列中添加新消息,并在当前执行的代码完成后进行处理。

因此,在显式执行$scope.$apply()的角度代码中,将其更改为下面的代码,它应该可以工作。

代码语言:javascript
复制
$timeout(function(){
   $scope.$apply();
},0)
票数 3
EN

Stack Overflow用户

发布于 2017-03-21 11:02:11

错误:$rootScope:inprog操作已在进行中

在任何时候,只能有一个$digest$apply操作在进行中。这是为了防止很难检测到错误进入您的应用程序。此错误的堆栈跟踪允许您跟踪当前正在执行的$apply$digest调用的起源,这将导致错误。

共同原因

除了简单地不正确地调用$apply$digest之外,在某些情况下,您可能通过自己的错误获得此错误。

不一致API (同步/异步)

在与API交互时经常会看到此错误,API有时是同步的,有时是异步的。

这并不是第三方图书馆的理想设计选择。

要解决这种类型的问题,可以将api固定为始终同步或异步,或者强制您的回调处理程序始终使用$timeout服务异步运行。

代码语言:javascript
复制
function MyController($scope, $timeout, thirdPartyComponent) {
  thirdPartyComponent.getData(function(someData) {
    $timeout(function() {
      $scope.someData = someData;
    }, 0);
  });
}

在这里,我们使用$timeout来安排将来调用堆栈中对作用域的更改。通过提供0ms的超时时间,这将尽快发生,$timeout将确保在单个$apply块中调用代码。

**仅将这一技术作为最后手段**。

最好找到错误的来源并修复它。

有关更多信息,请参阅AngularJS错误引用- $rootScope/inprog -诊断此错误

也看,

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42923234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档