2014-01-31 24 views
2

更改可观察值(例如,可观察数组中的许多项目)是否正在渲染视图同步发生?Knockout.js 2.3中的绑定处理是否同步?

我关心的是什么,如果任何其他JavaScript代码可以在视图渲染之前执行(和所有相关computeds的可能处理)结束。

因为JavaScript是单线程的,如果改变后的值的处理是同步的,那么我的理解是,没有其他的JavaScript代码可以被执行,并且可以被处理任何用户操作(例如,输入值的变化)。

这是正确的,还是有绑定时的处理需要一些时间来考虑任何其他的事情?

谢谢。

回答

-1

的观测将依次通知其用户,当线程打开。

看看这篇文章 -

http://ejohn.org/blog/how-javascript-timers-work/

当你观察到的更新,订阅更新将添加到队列中。如果其他东西已经存在,它将首先被评估。 JavaScript本质上是同步的,但可以被'欺骗'成承诺的异步,但这不是观察者的工作方式。

+0

因此,观察对象的处理被添加到队列的末尾。但是,如何渲染的HTML?它是否同步发生,并在同一线程? –

+0

这不是魔术,HTML由订阅更新。 –

+0

逐步通过调试器并观察其工作原理 –

3

观测量同步,并立即通知用户。每个订阅者都按照订阅的顺序通知。这些订户中的许多将被计算为观察值,其将立即更新自己并通知其订户等。更新DOM通过绑定处理程序来完成,所述处理程序使用计算的观察值来跟踪依赖性并运行更新。

因此,更新DOM是同步的。但你问到“渲染视图”。渲染由浏览器在需要时完成。它可能是同步的,但它通常不是。

+0

我有点困惑。我的理解是,你的回答与@PWKad的回答有点相反。还是我读错了? –

+0

@PWKad似乎不对。但也许他正在考虑[延期更新](https://github.com/mbest/knockout-deferred-updates)插件,它使用队列进行更新。 –

+0

@MichaelBest怎么样?可观察订阅不会停止当前正在执行的线程进行更新,然后继续,它们会在线程打开时立即更新。如果你想看到它的实际操作,请在自定义绑定处理程序中放置一个警报,并在计算中放入一个警报,然后更改计算所订阅的可观察值。每次都会首先计算更新,除非您说我对其他内容有误。为了进一步详细说明创建一个长时间运行的脚本并更改observable并观察dom是否未更新,直到脚本释放线程 –