Javascript AngularJS摘要后摘要队列

Javascript AngularJS摘要后摘要队列,javascript,angularjs,Javascript,Angularjs,我们的一页很重。为了减少观察者数量并加快角度摘要周期,我们使用了大量的准时绑定语法:。我们也在使用,以避免不必要的关注我们在这一页上的表达 这种策略使我们能够大大减少角度消化循环 但是这个策略有一个缺点:它使用$$postDigest(postDigestQueue)来在表达式成功求值后取消其匹配 那又怎样? 摘要结束时,angular将运行postDigestQueue。由于我们使用了大量的时间绑定表达式,我们的postdescigestqueue可以扩展到超过100000个排队的任务 问题是

我们的一页很重。为了减少观察者数量并加快角度摘要周期,我们使用了大量的准时绑定语法
。我们也在使用,以避免不必要的关注我们在这一页上的表达

这种策略使我们能够大大减少角度消化循环

但是这个策略有一个缺点:它使用$$postDigest
postDigestQueue
)来
在表达式成功求值后取消其匹配

那又怎样?

摘要结束时,angular将运行
postDigestQueue
。由于我们使用了大量的时间绑定表达式,我们的
postdescigestqueue
可以扩展到超过100000个排队的任务

问题是angular使用循环遍历队列:

while (postDigestQueue.length) {
  try {
    postDigestQueue.shift()();
  } catch (e) {
    $exceptionHandler(e);
  }
}
shift方法删除零索引处的元素并进行移位 连续索引处的值向下,然后返回删除的 价值观

是的,
Array.prototype.shift()
是一个非常昂贵的调用,当数组中有很多元素时

因此,我们的消化周期有时会超过20秒

当我们使用以下代码更改以前的代码时,速度要快得多:

for (var i = 0; i < postDigestQueue.length; i++) {
  try {
    postDigestQueue[i]();
  } catch (e) {
    $exceptionHandler(e);
  }
}
postDigestQueue.length = 0;
for(var i=0;i
他们这样做有什么原因吗? 我们不应该在一次绑定中使用那么多吗?

我可以看出一个原因:如果一个任务在队列中添加了一个需要的任务。有可能吗?(
$$postDigest
是一个专用队列)如果执行顺序不重要,答案是使用
pop
而不是
shift
,但它是否重要

编辑:顺序似乎很重要,因为
postDigestQueue
与动画一起使用


如果有人对可能的官方后续行动感兴趣,.

Angular团队将在下一个
1.5.x
版本中合并性能改进:


这将加快摘要周期,特别是当您像angular bind notifier那样使用大量
$$postDigest
时。

我将您的github问题添加到了问题中。这是一个非常有趣的问题!这是一个很好的问题,似乎是一个有趣的改进请求。我简单的猜测是angularJS 1.x的设计不是为了处理非常沉重的页面,标准页面应该是轻的。这就是为什么所有pur angularJS网格都是地狱般的,因为你有大量的数据,所以他们没有优化代码的这么多部分。