前言
python 的flask.ext.cache 通過注解這樣對方法返回結果進行緩存:
@cache.cached(timeout=300, key_prefix='view_%s', unless=None)def hello(name=None): print 'view hello called' return render_template('hello.html', name=name)這類實現方式對業務邏輯沒有絲毫的侵入性,非常之優雅。
最近在做 Node.js 地項目,然而 js ES 7 之前都不支持注解,目前見到的緩存框架雖然在 API 設計上都很簡潔、很有想法。
可是痛點在于它們都是侵入式的,需要在業務邏輯代碼中插入緩存邏輯,這些方式很不優雅。
正題
今天花點時間研究下js有沒有辦法,以比較優雅地方法實現緩存。
我對緩存框架的訴求:
不對原方法進行更改 能實現對不同參數地緩存 支持緩存時間我了解到的 js 能力:
可行性?
看了看 prototype 文檔
直覺告訴我看起來可行,以下是官方的說明:
當一個函數被調用時,調用的參數被保留在類似數組 "變量" 的參數中。例如, 在調用 "myFn (a、b、c)"時, 在myFn 的主體內的參數將包含 3個類似數組的元素對應于 (a、b、c)。 使用鉤子修改原型時,只需通過調用該函數的 apply (),將 this 與參數 (調用狀態) 傳遞給當前行為。這種模式可以用于任何原型,如 Node.prototype、 Function.prototype 等.
var current = Object.prototype.valueOf;// 由于我的屬性 "-prop-value"是交叉性的, 并不總是// 在同一個原型鏈上,我想要修改 Object.prototype: Object.prototype.valueOf = function() { if (this.hasOwnProperty('-prop-value')) { return this['-prop-value']; } else { // 它看起來不像我的對象之一,因此,讓我們退回到 // 默認行為,通過盡可能地復制當前行為來實現. // 此apply的行為類似于其他語言中的"super". // 即使 valueOf() 不帶參數, 其他的鉤子可能會帶有. return current.apply(this, arguments); }}從示例不難看出,我可以在某些條件下通過 apply() 方法調用函數原邏輯,某些條件執行我需要的新邏輯。
寫個 demo 測試一下
// 重寫Function的原型方法cacheFunction.prototype.cache = function () { var _self = this; return function() { console.log('arguments', arguments); var key = arguments[0]; if (cache.has(key)) { return cache.get(key) } else { return _self.apply(this, arguments) } }}定義 cache,當且僅當 key 為 1 時有值
var cache = { has: (key) => { if (key === 1) return true else return false }, get: (key) => { return "cached value " + key }}定義測試方法
function request(key) { return 'value of ' + key}
|
新聞熱點
疑難解答
圖片精選