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网格都是地狱般的,因为你有大量的数据,所以他们没有优化代码的这么多部分。