函數緩存

爲了講明白這個概念,假設你在開發一個天氣app。開始你不知道怎麼作,正好有一個npm包裏有一個getChanceOfRain的方法能夠調用:npm

import { getChangeOfRain } from 'magic-weather-calculator';

function showWeatherReport() {
  let result = getChangeOfRain();    // 這裏調用
  console.log('The change of rain tomorrow is: ', result);
}

只是這樣會遇到一個問題。不管你作什麼,只要調用這個方法就會消耗100毫秒。因此,若是某個用戶瘋狂點擊「顯示天氣」按鈕,每次點擊app都會有一段時間沒有響應。緩存

showWeatherReport(); // 觸發計算
showWeatherReport(); // 觸發計算
showWeatherReport(); // 觸發計算

這很不理性。在實際開發中,若是你已經知道結果了,那麼你不會一次一次的計算結果。重用上次的結果纔是上佳選擇。這就是函數緩存。函數緩存也就是緩存函數的結算結果,這樣就不須要一次一次的調用函數app

在下面的例子裏,咱們會調用memoizedGetChangeOfRain()。在這個方法裏咱們會檢查一下是否已經有結果了,而不會每次都調用getChangeOfRain()方法:函數

import { getChangeOfRain } from 'magic-weather-calculator';

let isCalculated = false;
let lastResult;

// 添加這個方法
function momoizedGetChangeOfRain() {
  if (isCalculated) {
    // 不須要在計算一次
    return lastResult;
  }
  
  // 第一次運行時計算
  let result = getChangeOfRain();
  
  lastResult = result;
  isCalculated = true;
  
  return result;
}

function showWeatherReport() {
  let result = momoizedGetChangeOfRain();
  console.log('The chance of rain tomottow is:', result);
}

不過這個也不是沒事就要用的。只有在狀況容許的時候採用。並且要肯定使用了以後有了性能的明顯提高。性能

原文地址:https://whatthefork.is/memoiz...code

相關文章
相關標籤/搜索