Javascript 角度运行函数,然后应用

Javascript 角度运行函数,然后应用,javascript,angularjs,asynchronous,Javascript,Angularjs,Asynchronous,我正在angular的一个控制器中运行一个大任务,我有一些观察器,它们可能在代码执行期间触发,由于性能提高,我不希望发生这种情况 在代码运行时,如何避免触发某些监视程序?这已经在角魔法里面处理了吗?这个问题可以用$q来解决,还是有更好的方法来解决 例如: $scope.variableThatKeepsChanging = {}; function someVeryLongFuntion(){ var someVar = variableThatKeepsChanging; (...)

我正在angular的一个控制器中运行一个大任务,我有一些观察器,它们可能在代码执行期间触发,由于性能提高,我不希望发生这种情况

在代码运行时,如何避免触发某些监视程序?这已经在角魔法里面处理了吗?这个问题可以用$q来解决,还是有更好的方法来解决

例如:

$scope.variableThatKeepsChanging = {};

function someVeryLongFuntion(){
  var someVar = variableThatKeepsChanging;
  (...);
}

$scope.clickedFn = function () {
  //Here should start someVeryLongFuntion()
  someVeryLongFuntion();
  //Only now should be run the $apply() function of angular 
}

//NOTE: I need the watcher to catch changes not done by someVeryLongFuntion()
$scope.$watch('variableThatKeepsChanging', function () {doSomething()});

谢谢。

您可以尝试使用
0
超时将其置于
$timeout
服务

$timeout(function(
    someVeryLongFunction();
), 0, false);

看看
$timeout
服务中的第三个参数,它不应该调用
$apply()
,但您需要在之后自己调用在您的情况下,我觉得使用
$emit
$broadcast
代替观察者更适合您,因此您可以直接控制何时发送事件

但是是的,你可以解除和重新绑定观察者。。。虽然切换它们是相当罕见的,也不是一个很好的做法

具有添加观察者的功能:

var addWatcher = function(name){
return $scope.$watch(name...)
}
如果你想让观察者做一些事情,只需给观察者添加一个回调,它就会做一些事情; 称之为:

var mywatcher = addWatcher('scopeName');
要禁用观察者呼叫:

myWatcher();

类似这样的东西

Javascript不会并行运行任务,而且由于应用程序的角度部分也在Javascript下运行,因此您不必担心它,因为在您执行的函数结束之前不会触发观察者

阅读更多关于Javascript事件循环和$digest和$apply的信息来理解这一点


(与浏览器事件循环集成)

那么不要观看我的应用程序的构建需要观看者,问题是在我建议对正在观看的变量进行排序之后,是否有任何方法可以停止摘要并随时执行摘要循环。