Question intéressante — vous pourriez avoir des caches indépendants pour chaque fonction. Le cache sur la fonction extérieure contiendra des fonctions. Chaque fonction intérieure pourrait avoir son propre cache indépendant. Ainsi, en appelant f(10)(1)
suivi de f(10)(2)
entraînerait l'appel d'une version mise en cache de la fonction intérieure. Appeler à nouveau f(10)(1)
toucherait les deux caches :
function getCachedF() {
// le cache extérieur contient des fonctions indexées par argument
let outer_memo = {}
const f = (arg1) => {
if (!outer_memo.hasOwnProperty(arg1)) {
// Créer une fonction interne dans le cache extérieur
// chaque fonction interne a besoin de son propre cache
// car elle renverra des valeurs différentes
// en fonction des appels de la fonction extérieure
let inner_memo = {}
console.log("cache extérieur vide")
outer_memo[arg1] = (arg2) => {
// une fonction memoized normale
// le cache est une paire de clé:valeur simple
if (!inner_memo.hasOwnProperty(arg2)) {
console.log("cache intérieur vide")
inner_memo[arg2] = arg1 + arg2
}
return inner_memo[arg2]
}
}
return outer_memo[arg1]
}
return f
}
let f = getCachedF()
// les deux caches sont vides
console.log("3+5", f(3)(5))
// résultat mis en cache
console.log("3+5", f(3)(5))
// seulement le cache intérieur est utilisé
console.log("3+8", f(3)(8))
// le cache interne n'est utilisé que si les deux arguments sont les mêmes
console.log("10+8", f(10)(8))
Une autre alternative serait d'avoir un seul cache avec des clés qui sont une combinaison des deux arguments, mais alors la fonction interne devrait toujours être appelée.
1 votes
Ma supposition est que vous devriez ajouter une couche différente qui mettrait en cache les appels....
1 votes
Vérifiez la bibliothèque
reselect
. devrait faire ce que vous voulez directement.1 votes
Pourquoi faut-il le currifier, cela semble être une abstraction inutile.