记忆回调函数
Memoize callback function
我正在
上尝试这个备忘录
function getData(n, m, callback){
callback(n+m);
};
let memoizedData = memoize(getData);
console.log(memoizedData(5, 4, (result)=>{})) // 9;
我想缓存结果,即 9,所以每当下一次调用发生时,它都会从缓存中获取。
我理解 memoization 如果 getData 有 return n+m 而不是放入回调。
任何帮助将不胜感激。
编辑:想通过 vanillaJs 实现它。
为更清楚地编辑上述问题
function getData(n, m, callback){
callback(n+m);
};
let memoizedData = memoize(getData);
memoizedData(5, 4, (result)=>{console.log(result)}) // 9;
memoizedData(5, 4, (result)=>{console.log(result)}) // 9 - returned from cache
如果我没理解错的话,你要求的是 memoize
的实现。至于您的 console.log
:这很奇怪,因为结果不是 returned,而是作为参数传递给回调。所以你实际上应该在那个回调中打印。您甚至可以将 console.log
作为 回调传递。
对于 memoize
的实现,我假设要记忆的函数总是有一个回调作为最后一个参数。
首先,memoize
应该 return 一个接受与记忆函数相同参数的函数。
想法是维护一个 Map,以传递给函数的参数(不包括回调参数)为键,并具有相应的结果。构建密钥的一种方法是形成参数的 JSON 表示。
当 memoize
被调用时,参数形成一个映射中已经存在的键,然后使用映射中的相应值调用回调。如果不存在,则使用相同的参数集调用函数,但回调除外。让回调成为一个将结果存储在地图中的函数,然后将结果传递给传递给 memoize
.
的回调
你可以这样写:
function memoize(func) {
let map = new Map; // for memoization
return function(...args) {
let callback = args.pop(); // last argument must be a function
let key = JSON.stringify(args);
let result = map.get(key);
if (result !== undefined) {
console.log(`getting result from map.get('${key}')`);
return callback(result);
}
console.log(`calling ${func.name}(${args.join(", ")}, callback)`);
func(...args, result => {
console.log(`writing result with map.set('${key}', ${result})`);
map.set(key, result);
callback(result);
});
}
}
function getData(n, m, callback){
callback(n+m);
}
let memoizedData = memoize(getData);
memoizedData(5, 4, console.log) // 9 calling getData;
memoizedData(5, 4, console.log) // 9 from memory;
注意这个:
memoizedData(5, 4, console.log)
...只是“短”:
memoizedData(5, 4, (result) => console.log(result))
唯一的区别是 console.log
周围有一个额外的包装函数,但实际上没有真正的区别。
如果您询问如何实现记忆化,您可以这样实现
import { useMemo, useCallback } from 'react';
export default function Index() {
const getData = useCallback((n, m, callback) => callback(n + m), []);
let memoizedData = useMemo(() => getData(5, 4, (result) => result), [
getData,
]);
console.log(memoizedData);
return null;
}
我正在
上尝试这个备忘录function getData(n, m, callback){
callback(n+m);
};
let memoizedData = memoize(getData);
console.log(memoizedData(5, 4, (result)=>{})) // 9;
我想缓存结果,即 9,所以每当下一次调用发生时,它都会从缓存中获取。 我理解 memoization 如果 getData 有 return n+m 而不是放入回调。 任何帮助将不胜感激。
编辑:想通过 vanillaJs 实现它。 为更清楚地编辑上述问题
function getData(n, m, callback){
callback(n+m);
};
let memoizedData = memoize(getData);
memoizedData(5, 4, (result)=>{console.log(result)}) // 9;
memoizedData(5, 4, (result)=>{console.log(result)}) // 9 - returned from cache
如果我没理解错的话,你要求的是 memoize
的实现。至于您的 console.log
:这很奇怪,因为结果不是 returned,而是作为参数传递给回调。所以你实际上应该在那个回调中打印。您甚至可以将 console.log
作为 回调传递。
对于 memoize
的实现,我假设要记忆的函数总是有一个回调作为最后一个参数。
首先,memoize
应该 return 一个接受与记忆函数相同参数的函数。
想法是维护一个 Map,以传递给函数的参数(不包括回调参数)为键,并具有相应的结果。构建密钥的一种方法是形成参数的 JSON 表示。
当 memoize
被调用时,参数形成一个映射中已经存在的键,然后使用映射中的相应值调用回调。如果不存在,则使用相同的参数集调用函数,但回调除外。让回调成为一个将结果存储在地图中的函数,然后将结果传递给传递给 memoize
.
你可以这样写:
function memoize(func) {
let map = new Map; // for memoization
return function(...args) {
let callback = args.pop(); // last argument must be a function
let key = JSON.stringify(args);
let result = map.get(key);
if (result !== undefined) {
console.log(`getting result from map.get('${key}')`);
return callback(result);
}
console.log(`calling ${func.name}(${args.join(", ")}, callback)`);
func(...args, result => {
console.log(`writing result with map.set('${key}', ${result})`);
map.set(key, result);
callback(result);
});
}
}
function getData(n, m, callback){
callback(n+m);
}
let memoizedData = memoize(getData);
memoizedData(5, 4, console.log) // 9 calling getData;
memoizedData(5, 4, console.log) // 9 from memory;
注意这个:
memoizedData(5, 4, console.log)
...只是“短”:
memoizedData(5, 4, (result) => console.log(result))
唯一的区别是 console.log
周围有一个额外的包装函数,但实际上没有真正的区别。
如果您询问如何实现记忆化,您可以这样实现
import { useMemo, useCallback } from 'react';
export default function Index() {
const getData = useCallback((n, m, callback) => callback(n + m), []);
let memoizedData = useMemo(() => getData(5, 4, (result) => result), [
getData,
]);
console.log(memoizedData);
return null;
}