记忆回调函数

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