淘汰赛:deferUpdates非常慢

时间:2019-07-04 12:35:07

标签: knockout.js computed-observable

我有一个包含数百个computerableObservables的剔除应用程序。如果我关闭deferUpdates,则更新速度较慢但可管理(我的计算机上为+ -1秒)。但是,如果我打开deferUpdates,这将变为68秒,在此期间chrome无法响应。

起初,我认为页面陷入了无限循环,因为当我暂停脚本执行时,堆栈跟踪不断重复。此片段重复了数十次:

 self._limitChange (knockout-3.5.0.debug.js:1452)
_evalDelayed (knockout-3.5.0.debug.js:2376)
markDirty (knockout-3.5.0.debug.js:2177)
notifySubscribers (knockout-3.5.0.debug.js:1398)
limitNotifySubscribers (knockout-3.5.0.debug.js:1353)
(anonymous) (knockout-3.5.0.debug.js:1254)
self._limitChange (knockout-3.5.0.debug.js:1452)`

最终,我发现_limitChange的每个堆栈帧中都有一个不同的可计算观察值。似乎淘汰赛以递归方式遍历了整个computedObservable-tree。

我的问题如下:

  1. 为什么使用ko.options.deferUpdates = true这么慢,而没有它,KO还需要重新计算整个树?
  2. 其他人是否有这个问题的经验,您如何解决?
  3. 为什么ko需要遍历整个树才能对所有内容调用markDirty?

任何见解都会受到赞赏。

0 个答案:

没有答案