我一直在使用AngularJS一会儿现在,并且已经找到了需要使用$超时在每隔一段时间(似乎通常是初始化一个jQuery插件)。
最近,我一直在试图让消化周期的更好,更深入的了解,我碰上了$ evalAsync功能。
这似乎是这个函数产生相似的结果$timeout
,只有你不给它拖延。 每次我用时间$timeout
它一直为0的延迟,所以现在我想知道如果我应该用$evalAsync
代替。
有没有两者之间有什么根本的区别? 你会用什么情况下,一个比其他? 我想获得的时候使用哪一个更好的感觉。
最近,我在这里基本上回答了这个问题: https://stackoverflow.com/a/17239084/215945 (这个答案的链接与MISKO一些github上的交流)
总结:
- 如果代码是使用$ evalAsync从指令排队, 后 DOM已被角操纵它应该运行,但在浏览器呈现前
- 如果代码是使用$ evalAsync从控制器排队,它应该运行之前 DOM已被角(之前的浏览器呈现)操纵的-很少这样做你想要这个
- 如果代码是使用$超时排队, 后 DOM已被角操纵它应该运行,并呈现浏览器后 (这可能导致闪烁在某些情况下)
对于那些构建复杂的应用程序,要知道,有你的选择的性能影响。 另外,我想完成马克的答案与更多的技术细节:
$超时(回调)会等待目前的消化周期进行(即角更新所有的模型和DOM),那么它会执行其回调-可能会影响到角模型-再推出全$apply
根$范围,和redigest一切。
$ evalAsync(回调),在另一方面,将回调添加到当前,或下,消化周期。 这意味着,如果你是一个消化周期(例如在一些调用的函数内ng-click
指令),这将不会等待什么,代码将被立即执行。 如果你是一个异步调用内,例如一个setTimeout
,一个新的周期消化( $apply
)将被触发。
所以在性能方面,它始终是更好地调用$evalAsync
,除非是对你很重要的观点是最新的执行你的代码,例如前,如果您需要查看在一些DOM属性,如元素宽度等。
如果您想了解$超时之间的区别更多的细节,$ evalAsync,$消化,$申请,我请你看我对其他问题的回答: https://stackoverflow.com/a/23102223/1501926
此外,一定要阅读文档 :
在$ evalAsync不保证何时会对表达式,只有执行:
- 认为调度的评价(优选之前DOM渲染)的功能之后将被执行。
- 至少一个$消化周期将表达执行之后进行。
注意: 如果此功能被称为$消化周期之外,一个新的$消化周期将调度 。 但是,鼓励总是调用代码,从变化的$应用调用内的模型。 这包括通过$ evalAsync评估代码。