Knockout的微任務隊列支援排程任務盡可能快地運作,同時仍然是異步的,努力安排它們在發生I / O,回流或重繪之前發生。 它在内部用于Knockout元件以維護異步行為,以及用于安排可觀察量的延遲更新。
這将把提供的回調函數添加到微任務隊列。 Knockout包括快速任務隊列,以FIFO順序運作任務,直到隊列為空。 當第一個任務被排程時,Knockout将使用浏覽器的微任務支援來排程flush事件(如果可能)。 這確定了第一個任務和後續任務的行為相似。
可以使用從ko.tasks.schedule傳回的句柄值取消微任務。 如果任務已經運作或以前已取消,則取消不執行任何操作。
如果任務抛出異常,它不會中斷任務隊列,這将繼續,直到它是空的。 異常将被推遲到稍後的事件,并可以使用ko.onError或window.onerror處理。
由于Knockout處理微任務隊列直到它為空,而不會導緻外部事件,許多或冗長的任務可能會導緻浏覽器頁面變得無響應。 如果檢測到進階别的遞歸,則通過取消所有剩餘的任務,Knockout可以防止無限遞歸。 例如,以下将最終停止并抛出一個錯誤:
當第一個任務被排程時(最初和之前的flush事件已經完成),Knockout将排程一個flush事件來處理微任務隊列。 如果可能,它将嘗試使用浏覽器自己的微服務功能。 在現代浏覽器中,它将使用DOM變異觀察器,在舊版本的Internet Explorer中,它将使用<script> onreadystatechange事件。 這些方法允許它在任何回流或重繪之前開始處理隊列。 在其他浏覽器中,它将恢複使用setTimeout。
Knockout提供了一些進階方法來控制何時處理微任務隊列。 如果您想将Knockout的微服務系統與另一個庫內建或者添加對其他環境的支援,這些功能非常有用。
<code>ko.tasks.runEarly()</code> — 調用此方法根據需要立即處理目前微任務隊列,直到它為空。 除了庫內建,您可以使用此方法,如果您有代碼排程一些任務,但随後需要同步處理這些任務的影響。
<code>ko.tasks.scheduler</code> — 覆寫此方法以重新定義或擴充Knockout如何計劃事件以處理和重新整理隊列。 當第一個任務被排程時,Knockout調用此方法,是以它必須排程事件并立即傳回。 例如,如果您的應用程式在Node.js中運作,您可能更喜歡對flush事件使用process.nextTick:ko.tasks.scheduler = process.nextTick ;.
作者:smallprogram
出處:
http://www.cnblogs.com/smallprogram
感謝您的閱讀。喜歡的、有用的就請大哥大嫂們高擡貴手"推薦一下"吧!你的精神支援是部落客強大的寫作動力。歡迎轉載!另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!