Angular:为什么$ evalAsync不是$ applyAsync?

时间:2014-01-31 02:17:03

标签: angularjs asynchronous definition angular-digest

关于范围的角度初学者问题(docs here)。

  1. $eval在范围的上下文中执行表达式。
  2. $apply基本上会调用$eval,然后调用$digest
  3. 为什么$evalAsync也会调用$digest(或者更确切地说,确保调用$digest)?
  4. 似乎$ eval Async应该被称为$ apply Async,不是吗?

    我是初学者 - 我错过了什么?

2 个答案:

答案 0 :(得分:3)

$evalAsync$applyAsync针对不同情况。

$ evalAsync :将表达式推迟到当前摘要周期的下一循环迭代。一个Angular摘要循环循环几次,直到没有数据变脏。如果没有正在进行的摘要周期,它将启动一个新的摘要周期(调用$apply方法)并评估其中的表达式(调用$eval方法)。如果从Angular范围调用函数但仍希望在摘要周期正在进行时消化脏数据,则此方法很有用,在这种情况下,您无法调用$apply

$ applyAsync :将表达式推迟到下一个摘要周期。在评估表达式之后,它总是开始一个新的摘要循环(调用$apply方法)。如果经常执行一些服务回调(如$http服务),请使用脏范围数据执行Angular范围,此方法很有用。但是,如果它为每个回调启动摘要,则可能会有糟糕的性能。因此,此方法通过在几个异步回调之间共享摘要周期来优化过程,这些回调优于方法$evalAsync

答案 1 :(得分:2)

$ applyAsync已存在:

  

安排$ apply的调用以后发生。实际时间差异因浏览器而异,但通常约为10毫秒。

     

这可用于排队需要在同一摘要中评估的多个表达式

evalAsync以不同的方式处理摘要:

  

$ evalAsync触发摘要,并且在预期a时不合适   消化不应该发生。

     

注意:如果在$ digest循环之外调用此函数,则将安排新的$ digest循环。

在AngularJS 1.3中隐式更改时调用此行为:

  

- 以前,即使将invokeApply设置为false,在promise解析期间也会发生$ rootScope摘要。   现在不再是这种情况,因为从$ timeout和$ interval返回的promise将不再触发$ evalAsync   (如果invokeApply为false,则反过来导致$摘要)。

     

变通办法包括手动触发$ scope。$ apply(),或者从promise回调中返回$ q.defer()。promise,并在适当的时候解析或拒绝它。

<强>参考