1.38.0memoize
نتیجه تابع را ذخیره میکند و زمانی که همان کلید کش دوباره درخواست شود، نتیجه ذخیرهشده را برمیگرداند.
memoize(fn, resolver):(...args: TArgs) => TResultپارامترها
fn(...args: TArgs) => TResultالزامیتابعی که نتایج آن باید ذخیره و کش شود.
resolver(...args: TArgs) => unknownاختیاریتابع اختیاری که برای ساخت کلید کش از آرگومانهای تابع استفاده میشود.
مقدار بازگشتی
(...args: TArgs) => TResultتابعی را برمیگرداند که نتایج تابع اصلی را کش کرده و در فراخوانیهای بعدی استفاده میکند.
مثالها
استفاده پایه
نتیجه برای یک آرگومان یکسان فقط یک بار محاسبه میشود.
const calculate = memoize((value: number) => {
console.log("Calculating...");
return value * 2;
});
console.log(calculate(5));
// Calculating...
// 10
console.log(calculate(5));
// 10چند آرگومان
وقتی resolver داده نشده باشد، چند آرگومان با JSON.stringify به یک کلید کش تبدیل میشوند.
const add = memoize((a: number, b: number) => {
console.log("Calculating...");
return a + b;
});
console.log(add(2, 3));
// Calculating...
// 5
console.log(add(2, 3));
// 5استفاده از resolver
با resolver میتوانید کلید کش را بهصورت سفارشی از روی آرگومانها تعیین کنید.
const getUser = memoize(
(id: number, name: string) => {
console.log("Fetching user...");
return { id, name };
},
(id) => id,
);
console.log(getUser(1, "Amir"));
// Fetching user...
// { id: 1, name: "Amir" }
console.log(getUser(1, "Ali"));
// { id: 1, name: "Amir" }یک آرگومان
با یک آرگومان و بدون resolver، خود آرگومان بهعنوان کلید کش استفاده میشود.
const square = memoize((value: number) => value * value);
console.log(square(4));
// 16
console.log(square(4));
// 16آرگومانهای متفاوت
کلیدهای کش متفاوت باعث میشوند تابع اصلی برای هر مقدار جداگانه اجرا شود.
const double = memoize((value: number) => {
console.log("Calculating...");
return value * 2;
});
console.log(double(5));
// Calculating...
// 10
console.log(double(10));
// Calculating...
// 20کش کردن نتیجه آبجکت
نتیجه برگرداندهشده ذخیره میشود و در فراخوانیهای بعدی با همان کلید، همان نتیجه کششده برگردانده میشود.
const createUser = memoize((name: string) => ({
name,
}));
const first = createUser("Amir");
const second = createUser("Amir");
console.log(first === second);
// true