2014-01-31 54 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是否未更新,直到腳本釋放線程 –