2016-07-05 9 views
0

Wenn _.memoize von lodash verwendet wird, ist es möglich, den gesamten Cache zu löschen?Wie wird der gesamte Memoize-Cache in lodash gelöscht?

Ich habe ein paar Diskussionen über Github gesehen: https://github.com/lodash/lodash/issues/1269 https://github.com/lodash/lodash/issues/265

Aber ich bin noch nicht 100% klar, wie dies würde genähert, wenn Sie klar eine Seite breit Cache tun wollen? Ist die Absicht, es zuerst auf eine WeakMap zu setzen, dann wie gewünscht zu löschen?

+0

Rufen Sie einfach erneut "Memoize" und überschreiben Sie Ihre Memo-Funktion, und der Cache ist weg. – Bergi

+0

Ich möchte alle/ganz auswendig 'zwischengespeicherten Funktionen speichern – Chris

Antwort

3

Lodash bietet keine Möglichkeit, den Cache aller Memo-Funktionen zu löschen. Du musst es eins nach dem anderen tun. Dies liegt daran, dass jede Memo-Funktion eine eigene Cache-Objektinstanz besitzt.

Blick auf lodash memoizesource code:

function memoize(func, resolver) { 
    var memoized = function() { 
    // ... 
    } 
    memoized.cache = new (memoize.Cache || MapCache); 
    return memoized; 
} 

Die GitHub Diskussionen Sie über Clearing-Cache eines einzigen memoized Funktion sind bezeichnet.

Sie können alle Memo-Funktionen in einem Array speichern, sodass sie über sie iterieren und den Cache einzeln löschen können.

const func1 = _.memoize(origFunc1); 
const func2 = _.memoize(origFunc2); 

const memoizedFunctions = []; 
memoizedFunctions.push(func1); 
memoizedFunctions.push(func2); 

// clear cache of all memoized functions 
memoizedFunctions.forEach(f => f.cache = new memoize.Cache); 
+0

Das funktionierte perfekt für mich, aber in Typescript musste ich tun: 'f.cache = new (_.memoize.Cache als any)' als der Compiler weigerte sich, das zu tun _new_ sonst. Könnte etwas falsch mit meiner Version der Typings für lodash sein. –