Angularjs &引用;错误:[$rootScope:inprog]$apply已在进行中”;使用$apply时,多个操作同时发生

Angularjs &引用;错误:[$rootScope:inprog]$apply已在进行中”;使用$apply时,多个操作同时发生,angularjs,Angularjs,看看我的代码 $scope.update = function () { //remove empty row in list before update if ($scope.PatternData.length > 1) { removeEmptyRow($scope.PatternData); } if (!$scope.$$phase) { $scope.$apply(); } $scope.$app

看看我的代码

$scope.update = function () {
    //remove empty row in list before update
    if ($scope.PatternData.length > 1) {
        removeEmptyRow($scope.PatternData);
    }

    if (!$scope.$$phase) {
        $scope.$apply();
    }
    $scope.$apply();

    //update data
    orderPatternService.updatePattern(function () {
        //reload datatable
        $scope.tableParams.reload();
        //display notification
        $timeout(function () {
            notifyService.popEdit();
        });
    },$scope.PatternData);
};
我想
在更新之前删除列表中的空行
更新数据
操作同时发生,所以我将

if (!$scope.$$phase) {
        $scope.$apply();
    }
    $scope.$apply();
在这两种行动之间

我在没有任何影响的情况下实现了我的想法,但是控制台中出现了
错误:[$rootScope:inprog]$apply已在进行中
错误


请告诉我此错误的原因

代码中可能有错误:

if (!$scope.$$phase) { // If you are controlling the digest phase like this,
    $scope.$apply();
}
$scope.$apply(); // then this line is not necessary!

使用
$scope.$$phase
是一种反模式,您考虑过承诺链接吗?或者只需在操作后调用
$timeout()
?它将在下一个勾号中调用摘要,因此它应该可以按预期工作。嗨,Kamil,这是因为我在
$timeout()
之前使用了
$scope.$$phase
?不,请看,我的答案,如果不清楚,我将扩展它。如果我删除
$scope.$apply()
在更新前删除列表中的空行
更新数据
操作不会同时发生,AngularJs会自动运行摘要周期。您的
IF
表示:“如果摘要周期未运行,则手动运行它”。但是在您的
IF
之后,您无论如何都在调用它。这就是为什么会出现错误。因此,至少要调用摘要周期2次,有时甚至3次。javascript中没有类似于
同一时间的东西,因为它是单线程的。您使用的是异步调用,可预测地处理异步调用的最佳方法是
承诺链接
,尝试用谷歌搜索它并了解它是如何工作的。这对你会有很大帮助。如果你需要任何进一步的建议,尽管问。嗨,卡米尔,我能再问你一个问题吗?