Javascript 记忆回调函数

Javascript 记忆回调函数,javascript,memoization,Javascript,Memoization,我在试着写这本回忆录 function getData(n, m, callback){ callback(n+m); }; let memoizedData = memoize(getData); console.log(memoizedData(5, 4, (result)=>{})) // 9; 我想缓存结果I,e,9,这样每当下一次调用发生时,它都会从缓存中取出。 我理解,如果getData返回n+m而不是放入回调函数,则会进行记忆。 任何帮助都将不胜感激 编辑:希望通过

我在试着写这本回忆录

function getData(n, m, callback){
    callback(n+m);
};
let memoizedData = memoize(getData);
console.log(memoizedData(5, 4, (result)=>{})) // 9;
我想缓存结果I,e,9,这样每当下一次调用发生时,它都会从缓存中取出。 我理解,如果getData返回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
:这很奇怪,因为结果不是返回的,而是作为参数传递给回调。所以你应该在回调中打印。您甚至可以将
console.log
作为回调传递

对于
memoize
的实现,我将假设memoize函数将始终具有一个回调作为最后一个参数

首先,
memoize
应该返回一个函数,该函数接受与被memoize的函数相同的参数

其思想是维护一个映射,由传递给函数的参数(不包括回调参数)设置键,并具有相应的结果。构建密钥的一种方法是形成参数的JSON表示形式

调用
memoize
时,参数形成映射中已存在的键,然后使用映射中的相应值调用回调。如果不存在,则使用相同的参数集调用该函数,回调除外。让回调函数将结果存储在映射中,然后将结果传递给传递给
memoize
的回调函数

以下是您如何编写它:

函数记忆(func){
let map=new map;//用于记忆
返回函数(…args){
let callback=args.pop();//最后一个参数必须是函数
让key=JSON.stringify(args);
让result=map.get(key);
如果(结果!==未定义){
log(`getting result from map.get('${key}')`);
返回回调(结果);
}
log(`calling${func.name}(${args.join(“,”)},callback)`);
func(…参数,结果=>{
log(`writing result with map.set('${key}',${result})`);
map.set(键、结果);
回调(结果);
});
}
}
函数getData(n、m、回调){
回调(n+m);
}
让memoizedData=memoize(getData);
memoizedData(5,4,console.log)//9调用getData;

memoizedData(5,4,console.log)//9来自内存如果您询问如何实现备忘录,您可以这样实现它

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;
}

是否尝试写入函数
记忆化
?您在尝试时遇到了什么问题?当
getData
没有返回任何内容,而是调用回调时,为什么您希望
console.log
打印任何有用的内容?我不太明白,但您是否正在考虑如何实现备忘录化?是的,我尝试过,但在回调时遇到了问题@trincotyes的回忆录和这个回调的东西。我能够用返回n+m的getSomeData实现同样的功能@Germanocheak我从这个答案中了解了很多,老实说,我想要这样的东西,但是如果我的memoizedData是``memoizedData(5,4,(result)=>{console.log(“result”,result)})``你想要
memoizedData
是递归的呢?你能描述一下你在这里想要什么吗?您是在说最后一行调用
memoizedData
时使用了更详细的回调参数吗?那当然行。你觉得有什么问题吗?请参见编辑我的答案。哦,是的,我知道这会起作用,非常感谢@trincot。非常感谢。我只是想知道,正如你提到的递归
memoizedData
,你是否碰巧遇到了一些问题,想与大家分享一下@trincotNo,这只是你在上面第一次评论的措辞。这让我很困惑,就好像你在定义
memoizedData
本身一样。但后来我意识到你只是在谈论如何调用它,而不是定义它。非常感谢你的分享,但我忘了提到我正试图通过vanillaJs解决这个问题。现在添加了一个编辑