gpt4 book ai didi

angularjs - 调试 $apply 已在进行中

转载 作者:行者123 更新时间:2023-12-02 21:29:29 24 4
gpt4 key购买 nike

我正在使用 AngularJS 开发 Chrome 扩展(因此它在 CSP 模式下运行)。 amServices.js 包含处理 Chrome native 消息传递的服务。那么在js/core/am/amServices.js:268:20处相关代码如下:

chrome.runtime.onMessage.addListener(
function (message, sender, sendResponse) {
$rootScope.$apply(function () {
if (message.type == 'login' && message.state == 'ok') {
//huge if/else if here for every kind of message

我的理解是,由于这里的所有代码都是异步调用的,并且可以触发大多数应用程序 View 中的修改,因此 $rootScope.$apply 是强制性的。然而,有时我会以一种完全随机的方式在控制台中得到这些:

Error: [$rootScope:inprog] http://errors.angularjs.org/1.2.13/$rootScope/inprog?p0=%24apply
at Error (native)
at chrome-extension://hbfchfkepmidgcdfcpnodlnmfjhekcom/lib/angular/angular.min.js:6:450
at n (chrome-extension://hbfchfkepmidgcdfcpnodlnmfjhekcom/lib/angular/angular.min.js:98:34)
at h.$apply (chrome-extension://hbfchfkepmidgcdfcpnodlnmfjhekcom/lib/angular/angular.min.js:104:195)
at chrome-extension://hbfchfkepmidgcdfcpnodlnmfjhekcom/js/core/am/amServices.js:268:20
at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
at Event.dispatchToListener (extensions::event_bindings:394:22)
at Event.dispatch_ (extensions::event_bindings:378:27)
at Event.dispatch (extensions::event_bindings:400:17)
at messageListener (extensions::messaging:192:31)

不,让我烦恼的是事实是,与这里解释的不同:

Why doesn't Angular ignore subsequent $digest invocations?

在我的堆栈跟踪中,我没有看到两个 $apply 调用,因此我无法知道冲突从何而来。此外,我无法运行 AngularJS Batarang 调试工具,因为它不适用于 CSP 模式。

我忽略这些错误,没有任何明显的后果,但我不确定忽略它们是否真的安全。关于如何知道哪两个 apply 调用触发了冲突,有什么想法吗?

最佳答案

如果你的问题是为什么?并且您预计只有当您有多个 $apply()

时才会发生错误

嗯,正如 @J.Wells 在对您的问题的评论中提到的那样,可能是因为其他 Angular 指令触发了 $scope.$apply 以及来自chrome.runtime 在 Angular 内部处于 $$phase 时发生。

看看source code对于 ng-click,AngularJS 内部使用与开发人员可用的相同的 $scope.$apply

因此,只需考虑诸如 ng-click 、 ng-change 之类的 Angular 指令使用 $scope.$apply 计算表达式,这会启动一个 $apply 阶段,ng-ifng-hide 等指令使用 $scope.$watch 计算表达式,该表达式位于 $digest 内部 阶段。

糟糕的理论,因为正如 @Wawy 所建议的,javascript 是单线程的,因此回调无法在摘要中执行(留下以便注释有意义):如果当您使用 ng-click 指令单击登录按钮时发生这种情况,可能是因为 chrome 在 $digest 阶段之前绑定(bind)和响应太快ng-click 完成,因此执行 onMessage 回调。

关于angularjs - 调试 $apply 已在进行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22682598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com