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

来源:http://www.cnblogs.com/smallprogram/archive/2016/10/19/5976428.html
-Advertisement-
Play Games

註意:這個速率限制API是在Knockout 3.1.0中添加的。 通常,更改的observable立即通知其訂戶,以便依賴於observable的任何計算的observable或綁定都會同步更新。 但是,rateLimit擴展器會導致observable在指定的時間段內抑制和延遲更改通知。 因此,... ...


註意:這個速率限制API是在Knockout 3.1.0中添加的。

通常,更改的observable立即通知其訂戶,以便依賴於observable的任何計算的observable或綁定都會同步更新。 但是,rateLimit擴展器會導致observable在指定的時間段內抑制和延遲更改通知。 因此,速率限制的observable非同步更新依賴關係。

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

  • 使事情在一定延遲後作出反應
  • 將多個更改合併到單個更新中

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

應用速率限制擴展

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

// Shorthand: Specify just a timeout in milliseconds
someObservableOrComputed.extend({ rateLimit: 500 });
 
// Longhand: Specify timeout and/or method
someObservableOrComputed.extend({ rateLimit: { timeout: 500, method: "notifyWhenChangesStop" } });

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

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

  2. notifyWhenChangesStop — 通知發生在可觀察者在指定時間段內沒有發生變化之後。 每次可觀察到的變化,該定時器被重置,因此如果可觀察者連續地改變比超時期間更頻繁,則不能發生通知。

示例1:基礎示例

考慮下麵代碼中的observable:

var name = ko.observable('Bert');
 
var upperCaseName = ko.computed(function() {
    return name().toUpperCase();
});

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

name('The New Bert');

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

var name = ko.observable('Bert').extend({ rateLimit: 500 });

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

示例2:當用戶停止輸入時執行某些操作

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

嘗試一下:

Type stuff here:

Current delayed value:

Stuff you have typed:

UI源碼:

<p>Type stuff here: <input data-bind='textInput: instantaneousValue' /></p>
<p>Current delayed value: <b data-bind='text: delayedValue'> </b></p>
 
<div data-bind="visible: loggedValues().length > 0">
    <h3>Stuff you have typed:</h3>
    <ul data-bind="foreach: loggedValues">
        <li data-bind="text: $data"></li>
    </ul>
</div>

視圖模型源碼:

function AppViewModel() {
    this.instantaneousValue = ko.observable();
    this.delayedValue = ko.pureComputed(this.instantaneousValue)
        .extend({ rateLimit: { method: "notifyWhenChangesStop", timeout: 400 } });
 
    // Keep a log of the throttled values
    this.loggedValues = ko.observableArray([]);
    this.delayedValue.subscribe(function (val) {
        if (val !== '')
            this.loggedValues.push(val);
    }, this);
}
 
ko.applyBindings(new AppViewModel());

計算可觀測量的特殊考慮

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

強制限速觀察者總是通知訂閱者

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

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

myViewModel.fullName = ko.computed(function() {
    return myViewModel.firstName() + " " + myViewModel.lastName();
}).extend({ notify: 'always', rateLimit: 500 });

與延遲更新的比較

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

ko.computed(function() {
    // ....
}).extend({ deferred: true });

 

與throttle延長器比較

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

使用rateLimit時:

  1. 對可觀測量的寫入不被延遲; observables值立即更新。 對於可寫的計算可觀測量,這意味著寫函數總是立即運行。
  2. 所有更改通知都會延遲,包括手動調用valueHasMutated時。 這意味著您不能使用valueHasMutated強制速率限制的observable通知未更改的值。
  3. 預設速率限制方法與throttle演算法不同。 要匹配throttle行為,請使用notifyWhenChangesStop方法。
  4. 速率限制的計算觀察值的評估不受速率限制; 如果你讀它的值,它會重新評估。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Waud.js 是一個Web音頻庫,有一個HTML5音頻降級處理方案。 它允許您利用Web音頻API為你的Web應用程式控制音頻功能。在不支持Web音頻API的非現代瀏覽器使用HTML5音頻降級方案。 ...
  • 關於本系列文章 本系列文章總共8個章節,41篇文章,主要翻譯自官方API文檔,加上自己的一些理解撰寫而成。 區別與園子和網路上的其他一些Knockout教程,這個系列教程將由淺入深的系統的介紹Knockout的知識點和使用細節。 並且本系列KnockoutJS教程是基於最新的3.4.0版本入手的。對... ...
  • Knockout旨在允許您將任意JavaScript對象用作視圖模型。 只要一些視圖模型的屬性是observables,您可以使用KO將它們綁定到您的UI,並且UI將在可觀察屬性更改時自動更新。 大多數應用程式需要從後端伺服器獲取數據。 由於伺服器沒有任何可觀察的概念,它只提供一個純JavaScri... ...
  • 調用 localstorge、cookies 等本地存儲方式 方法一:使用localStorage 使用localStorage.setItem(key,value);添加內容 使用storage事件監聽添加、修改、刪除的動作 window.addEventListener("storage",fu ...
  • <script type="text/javascript"> window.onload = function cc() { var tr=document.getElementsByTagName("tr"); for(var i=0;i<tr.length;i++){ tr[i].style. ...
  • 我現在做的一個項目是angular,但是我用直接引用百度地圖的方法引進js,寫html,js代碼,發現,我去,報錯了,我一開始還以為是百度地圖跟angular有衝突,然後我就去搜索啊,發現angular也有一個百度地圖插件,無奈我用了報錯了,網上說要用angular2版本才能相容,但是我又不會下載2 ...
  • 我們中國嘛傳統段落就是要首行縮進兩個字,首先首行縮進的css是text-indent: 然後這個值是多少呢,一般你的字母的font-size是多少,text-indent:2*font-size的值 比如你的字的字體大小是16px,那麼你想讓段落首行縮進兩個字的話就是text-indent:2*16 ...
  • [TOC] 名詞解釋 state: 它是組件的屬性,主要用來存儲組件自身需要的數據。 虛擬DOM: 它是ReactJS中提出的一個概念,是將真實的DOM結構映射成一個JSON數據結構。 1.組件生命周期 1.創建階段 :該方法會返回一個對象,並緩存下來。然後與父組件指定的props對象合併,最後賦值 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...