javascript中的setTimeout与angularjs中的$ timeout服务之间的差异

时间:2016-09-03 20:19:39

标签: javascript angularjs settimeout angular-services

我是角度框架的新手。这是我的场景,我想在一段时间后更改我的$ scope.variable所以我使用了javascript setTimeout方法。

$scope.variable = 'Previous';

setTimeout(function(){
  $scope.variable='NEXT';
},3000);

此代码对我不起作用。我使用$apply()来使这段代码正常工作。

后来我才知道angular本身有一个$ timeout服务,可以完成同样的工作。

$scope.variable = 'Previous';

$timeout(function () {
  $scope.variable = 'NEXT';
}, 2000);

如何比较$timeout服务与javascript setTimeout ??

的效果

为什么我们应该使用$timeout而不是setTimeout ??

请给我一些使用它的例子和理由,以显示性能。

谢谢:)

2 个答案:

答案 0 :(得分:26)

在某些情况下,需要执行某种超时操作,我们经常使用JavaScript的setTimeout()函数实现此目的。

但是,如果我们在AngularJS应用程序中使用setTimeout(),我们还需要使用$scope.$apply()来确保scope的任何更改都会反映在其他位置(即数据绑定在view)。

AngularJS为此提供了一个方便的包装:$timeout() - 它为$apply()提供了我们不必$apply更改的内容。

关于效果

如果您正在使用$timeout创建基本上是间隔的内容,那么请不要使用它。如果您的应用程序很大,那么$apply也会触发$digest周期,您可能不希望它发生,这肯定会降低性能。

答案 1 :(得分:19)

从外部处理时(包括ajax)处理的任何AngularJS范围变量都需要$ apply()。

$ timeout()处理当前范围,并在完成所有更改检测后在相同的摘要周期中运行。

我最近发现的$ timeout()的一个美妙之处是,如果你没有传递时间参数,它将等待DOM完成。

所以,

$timeout(function(){
  console.log("show after directive partial loaded")
}); //note, no time parameter

在指令中运行此代码,并且在指令加载部分后将触发超时回调函数

希望这有帮助。