KnockoutJS 3.X API 第七章 其他技術(7) 微任務
注意:本文檔適用于Knockout 3.4.0及更高版本。
Knockout的微任務隊列
Knockout的微任務隊列支持調度任務盡可能快地運行,同時仍然是異步的,努力安排它們在發生I / O,回流或重繪之前發生。 它在內部用于Knockout組件以維護異步行為,以及用于安排可觀察量的延遲更新。
ko.tasks.schedule(function () { // ... });
這將把提供的回調函數添加到微任務隊列。 Knockout包括快速任務隊列,以FIFO順序運行任務,直到隊列為空。 當第一個任務被調度時,Knockout將使用瀏覽器的微任務支持來調度flush事件(如果可能)。 這確保了第一個任務和后續任務的行為相似。
可以使用從ko.tasks.schedule返回的句柄值取消微任務。 如果任務已經運行或以前已取消,則取消不執行任何操作。
var handle = ko.tasks.schedule(/* ... */); ko.tasks.cancel(handle);
錯誤處理
如果任務拋出異常,它不會中斷任務隊列,這將繼續,直到它是空的。 異常將被推遲到稍后的事件,并可以使用ko.onError或window.onerror處理。
遞歸任務限制
由于Knockout處理微任務隊列直到它為空,而不會導致外部事件,許多或冗長的任務可能會導致瀏覽器頁面變得無響應。 如果檢測到高級別的遞歸,則通過取消所有剩余的任務,Knockout可以防止無限遞歸。 例如,以下將最終停止并拋出一個錯誤:
function loop() { ko.tasks.schedule(loop); } loop();
實施
當第一個任務被調度時(最初和之前的flush事件已經完成),Knockout將調度一個flush事件來處理微任務隊列。 如果可能,它將嘗試使用瀏覽器自己的微服務功能。 在現代瀏覽器中,它將使用DOM變異觀察器,在舊版本的Internet Explorer中,它將使用<script> onreadystatechange事件。 這些方法允許它在任何回流或重繪之前開始處理隊列。 在其他瀏覽器中,它將恢復使用setTimeout。
高級隊列控制
Knockout提供了一些高級方法來控制何時處理微任務隊列。 如果您想將Knockout的微服務系統與另一個庫集成或者添加對其他環境的支持,這些功能非常有用。
-
ko.tasks.runEarly()— 調用此方法根據需要立即處理當前微任務隊列,直到它為空。 除了庫集成,您可以使用此方法,如果您有代碼調度一些任務,但隨后需要同步處理這些任務的影響。 -
ko.tasks.scheduler— 覆蓋此方法以重新定義或擴充Knockout如何計劃事件以處理和刷新隊列。 當第一個任務被調度時,Knockout調用此方法,因此它必須調度事件并立即返回。 例如,如果您的應用程序在Node.js中運行,您可能更喜歡對flush事件使用process.nextTick:ko.tasks.scheduler = process.nextTick ;.

浙公網安備 33010602011771號