天天看點

KnockoutJS 3.X API 第七章 其他技術(4) 速率限制

通常,更改的observable立即通知其訂戶,以便依賴于observable的任何計算的observable或綁定都會同步更新。 但是,rateLimit擴充器會導緻observable在指定的時間段内抑制和延遲更改通知。 是以,速率限制的observable異步更新依賴關系。

速率限制擴充器可以應用于任何類型的可觀察量,包括可觀察數組和計算可觀察量。 速率限制的主要用例是:

使事情在一定延遲後作出反應

将多個更改合并到單個更新中

如果您隻需要組合更新而不添加延遲,則延遲更新提供了一種更有效的方法。

速率限制支援兩種參數格式:

方法選項控制通知何時觸發,并接受以下值:

<code>notifyAtFixedRate</code> — 未另行指定時的預設值。 通知發生在從第一次更改到可觀察者的指定時間段(最初或自上一次通知之後)。

<code>notifyWhenChangesStop</code> — 通知發生在可觀察者在指定時間段内沒有發生變化之後。 每次可觀察到的變化,該定時器被重置,是以如果可觀察者連續地改變比逾時期間更頻繁,則不能發生通知。

考慮下面代碼中的observable:

通常,如果您更改名稱如下:

upperCase Name将在下一行代碼運作之前立即完成。 但是如果你改為使用rateLimit定義名稱如下:

upperCaseName不會在名稱更改時立即重新計算,而是在将其新值通知給upperCaseName之前,将等待500毫秒(半秒),然後重新計算其值。 無論在這500ms内名稱是多少次更改,upperCaseName隻會更新一次最新的值。

在這個執行個體中,有一個instantValue observable,當你按下一個鍵時立即反應。 然後将其封裝在delayedValue計算observable中,該observable配置為僅當更改停止至少400毫秒時通知使用notifyWhenChangesStop rate-limit方法。

嘗試一下:

Type stuff here:

Current delayed value: <b></b>

UI源碼:

視圖模型源碼:

對于計算的observable,當計算的observable的依賴性之一改變而不是其值改變時,觸發速率限制定時器。 計算的observable不會重新求值,直到實際需要它的值 - 在發生更改通知的逾時時間段之後,或直接通路計算的可觀察值時。 如果需要通路計算的最近評估的值,可以使用peek方法執行此操作。

當any observable的值是原始值(數字,字元串,布爾值或null)時,隻有當observable的依賴項設定為實際上與之前不同的值時,才會通知它的依賴項。 是以,原始值的速率限制可觀察量隻有當它們的值在逾時周期結束時實際上不同時才通知。 換句話說,如果原始值的速率限制的observable被改變為新的值,然後在逾時時間段結束之前改變回原始值,則不會發生通知。

如果要確定始終通知訂閱者更新,即使該值相同,除了rateLimit之外,還要使用notify擴充器:

Knockout 3.4.0版本增加了對延遲更新的支援,通過使通知和更新異步,它的工作方式類似于速率限制。 但是,不是使用定時延遲,而是在執行I / O,回流或重繪之後,在目前任務之後盡快處理延遲更新。 如果要更新到3.4.0并且使用速率限制逾時(例如,0毫秒)的代碼,則可以修改為使用延遲更新:

如果要使用已棄用的throttle擴充程式遷移代碼,則應注意以下方法,即rateLimit擴充程式與throttle擴充程式不同。

使用rateLimit時:

對可觀測量的寫入不被延遲; observables值立即更新。 對于可寫的計算可觀測量,這意味着寫函數總是立即運作。

所有更改通知都會延遲,包括手動調用valueHasMutated時。 這意味着您不能使用valueHasMutated強制速率限制的observable通知未更改的值。

預設速率限制方法與throttle算法不同。 要比對throttle行為,請使用notifyWhenChangesStop方法。

速率限制的計算觀察值的評估不受速率限制; 如果你讀它的值,它會重新評估。

作者:smallprogram

出處:

http://www.cnblogs.com/smallprogram

感謝您的閱讀。喜歡的、有用的就請大哥大嫂們高擡貴手"推薦一下"吧!你的精神支援是部落客強大的寫作動力。歡迎轉載!另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!