Javascript 视图反映更新的$scope值之前的长延迟

Javascript 视图反映更新的$scope值之前的长延迟,javascript,angularjs,Javascript,Angularjs,在我的Angular 1.4.X应用程序中,控制器中有一些类似的代码 function submitForm() { $scope.submissionInProgress = true; myService.veryExpensiveOperation(); $scope.submissionInProgress = false; } 在视图中,我尝试使用$scope.submissionprogress在veryExpensiveOperation()(同步操作)进

在我的Angular 1.4.X应用程序中,控制器中有一些类似的代码

function submitForm() {
    $scope.submissionInProgress = true;
    myService.veryExpensiveOperation();
    $scope.submissionInProgress = false;
}
在视图中,我尝试使用
$scope.submissionprogress
veryExpensiveOperation()
(同步操作)进行时显示/隐藏微调器

<div ng-show="submissionInProgress" class="spinner">
    Please wait...
</div>

请稍候。。。

但是,实际情况是,直到
veryExpensiveOperation()
几乎完成后,才会显示微调器。换句话说,调用
$scope.submissionInProgress=true
和实际显示微调器之间似乎有几秒钟的延迟。

然后$http请求是异步的。
$scope.submissionprogress
的值在请求完成之前更改

如果发出
$http
请求,最好在
解析
函数内切换
$scope.submissionprogress

e、 g


您还可以使用回调

回拨 以及非常昂贵的操作功能:

veryExpensiveOperation = function(callback) {
...
success: function() {
   if(typeof callback == "Function") {
      callback();
   }
}
...
}
解决方案 我使用
$timeout
修复了此问题,如下所示:

function submitForm() {
    $scope.submissionInProgress = true;

    $timeout(function() {
        myService.veryExpensiveOperation();
        $scope.submissionInProgress = false;
    });
}

这与问题无关,他的问题是第一个赋值
$scope.submissionInProgress=true
实际显示微调器花费了太多时间。这与问题无关,他的问题是,第一个赋值
$scope.submissionInProgress=true
花费了太多的时间来实际显示微调器。@RonDadon很明显,问题
submissionInProgress=false
被称为非常快…不,不是。如果调用
submissionInProgress=false
太快,微调器将永远不会显示,不会延迟显示。除非问题是错的…@RonDadon对不起,我不明白你的说法。我跟你说的一样。
submissionprogress=true
submissionprogress=false
几乎是立即设置的,这个问题可以通过回调解决。您说
submissionprogress=true
立即被
submissionprogress=false
覆盖。如果是这种情况,在
非常昂贵的操作完成之前,微调器将永远不会出现,或出现很短的时间,然后移除。根据问题,问题是
似乎在调用$scope.submissionInProgress=true和实际显示微调器之间有几秒钟的延迟
——这不是一回事。再说一次,除非问问题的人没有把它说对。这个页面有很多绑定吗?尝试使用诊断工具,例如.Is
veryExpensiveOperation
是异步操作吗?@LeonardoChaia不,是synchronous@D最后,从AngularJS上下文调用
submitForm
?我的意思是,它不是从需要包装在
$scope.$apply
?@LeonardoChaia中的外部库调用的,它是从AngularJS上下文调用的
veryExpensiveOperation = function(callback) {
...
success: function() {
   if(typeof callback == "Function") {
      callback();
   }
}
...
}
function submitForm() {
    $scope.submissionInProgress = true;

    $timeout(function() {
        myService.veryExpensiveOperation();
        $scope.submissionInProgress = false;
    });
}