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能夠防止無限遞歸。 例如,如下將最終中止並拋出一個錯誤:oop
function loop() { ko.tasks.schedule(loop); } loop();
當第一個任務被調度時(最初和以前的flush事件已經完成),Knockout將調度一個flush事件來處理微任務隊列。 若是可能,它將嘗試使用瀏覽器本身的微服務功能。 在現代瀏覽器中,它將使用DOM變異觀察器,在舊版本的Internet Explorer中,它將使用<script> onreadystatechange事件。 這些方法容許它在任何迴流或重繪以前開始處理隊列。 在其餘瀏覽器中,它將恢復使用setTimeout。spa
Knockout提供了一些高級方法來控制什麼時候處理微任務隊列。 若是您想將Knockout的微服務系統與另外一個庫集成或者添加對其餘環境的支持,這些功能很是有用。 code
ko.tasks.runEarly()
— 調用此方法根據須要當即處理當前微任務隊列,直到它爲空。 除了庫集成,您可使用此方法,若是您有代碼調度一些任務,但隨後須要同步處理這些任務的影響。blog
ko.tasks.scheduler
— 覆蓋此方法以從新定義或擴充Knockout如何計劃事件以處理和刷新隊列。 當第一個任務被調度時,Knockout調用此方法,所以它必須調度事件並當即返回。 例如,若是您的應用程序在Node.js中運行,您可能更喜歡對flush事件使用process.nextTick:ko.tasks.scheduler = process.nextTick ;.遞歸