代码之家  ›  专栏  ›  技术社区  ›  bspoel

淘汰:延迟更新非常慢

  •  0
  • bspoel  · 技术社区  · 7 年前

    我有一个击倒应用程序,有数百个可计算的观察值。如果我关闭了延迟更新,更新会很慢,但可以管理(在我的计算机上为+1秒)。但是,如果我打开延迟更新,这将变为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)`
    

    最后我发现每一个stackframe的_limitChange都有一个不同的可计算的可观察到的。似乎knockout递归地遍历了整个可计算的可观察树。

    我的问题如下:

    1. 为什么使用ko.options.deferUpdates=true时速度太慢,而没有它,ko还需要重新计算整个树?
    2. 还有谁有这个问题的经验吗?你是怎么解决的?
    3. 为什么ko需要遍历整棵树来调用markDirty?

    任何见解都是非常感谢的。

    0 回复  |  直到 7 年前
    推荐文章