Estoy luchando para resolver una pregunta en la parte delantera grande, enlace . La tarea es implementar una función de memorización general. Encontré esta solución, pero tengo problemas para entender qué es/hace el resolutor. La primera vez que me encuentro con ese término y la búsqueda en Google no fue útil.
function memo(func, resolver = (...args) => args.join('_')) { const cache = new Map(); return function(...args) { const cacheKey = resolver(...args); if (cache.has(cacheKey)) { return cache.get(cacheKey); } const value = func.apply(this, args); cache.set(cacheKey, value); return value; } }No es un "resolver", sino más bien un "hash de argumentos", una función que devuelve un hash único dado un conjunto de argumentos.
La idea aquí es almacenar en caché el resultado de llamar a la función memorizada con un conjunto dado de argumentos almacenando el resultado en un mapa usando el "hash de argumentos" como clave.
(Probablemente se llame "resolver" porque permite que el memoizer resuelva las entradas de caché).
(El "resolver" predeterminado en su fragmento de código concatena ingenuamente los valores de los argumentos con el delimitador "_" . Es ingenuo porque no tiene en cuenta los casos en los que un argumento en sí mismo puede contener un "_" .)
Suponiendo que tiene una función que toma una cierta cantidad de argumentos ...
var underlyingFunction = function(arg1, arg2, arg3){ return arg1+arg2+arg3; };Desea crear una versión de esta función que almacene en caché los valores devueltos para valores específicos pasados, de modo que pueda omitir los cálculos y simplemente devolver el mismo valor que se devolvió la última vez que se pasaron esos mismos argumentos.
Y realmente... en lugar de codificar esta función para hacer eso específicamente, desea crear una función que pueda crear una función de almacenamiento en caché a partir de cualquier función subyacente...
Para hacer esto, necesita una función que:
Reescribiendo su código de muestra para explicarlo más completamente
const underlyingFunction = function(arg1, arg2, arg3) { return arg1 + arg2 + arg3; }; const serializingFunction = function(...args) { /* creates a '_' delimited string to use as unique id for that particular function call */ return args.join('_'); }; var cachingFunctionCreator = function(func, serializer) { // if serializer wasnt passed in, have it be serializingFunction serializer = serializer || serializingFunction; // to store all function call ids and their result values const cache = new Map(); // return the new function return function(...args) { // call serializing function to get the function call id const cacheKey = serializer(...args); // check to see if we've seen this id before // if so, dont call the underlying function... // just return the previously stored result for that id if (cache.has(cacheKey)) { console.log(cacheKey + ' was passed in previously'); return cache.get(cacheKey); } // otherwise, call the underlying function with the current args // store the id and result value into the map // and return the current result console.log('first time seeing: ' + cacheKey); const value = func.apply(this, args); cache.set(cacheKey, value); return value; }; }; var cachingFunction = cachingFunctionCreator(underlyingFunction); console.log('Calling underlying function'); console.log(underlyingFunction('a', 'b', 'c')); console.log('Calling cached function'); console.log(cachingFunction('a', 'b', 'c')); console.log('Calling cached function'); console.log(cachingFunction('d', 'e', 'f')); console.log('Calling cached function'); console.log(cachingFunction('g', 'h', 'i')); console.log('Calling cached function'); console.log(cachingFunction('a', 'b', 'c'));