首页 > 其他分享 >模拟 localStorage 时如何实现过期时间功能

模拟 localStorage 时如何实现过期时间功能

时间:2024-12-08 09:34:12浏览次数:2  
标签:getItem 过期 myLocalStorage localStorage key removeItem 模拟

在前端模拟 localStorage 并实现过期时间功能,主要思路是将过期时间与存储的数据一起保存,并在读取数据时检查是否过期。以下提供两种实现方式:

方法一:利用 JSON.stringifyJSON.parse

这种方法将数据和过期时间一起存储在一个 JSON 字符串中。

const myLocalStorage = {
  setItem(key, value, expirationTime) { // expirationTime in milliseconds
    const now = new Date().getTime();
    const item = {
      value: value,
      expiry: now + expirationTime,
    };
    localStorage.setItem(key, JSON.stringify(item));
  },

  getItem(key) {
    const itemStr = localStorage.getItem(key);
    if (!itemStr) {
      return null;
    }
    const item = JSON.parse(itemStr);
    const now = new Date().getTime();
    if (now > item.expiry) {
      localStorage.removeItem(key);
      return null;
    }
    return item.value;
  },

  removeItem(key) {
    localStorage.removeItem(key);
  },

  clear() {
    localStorage.clear();
  }
};


// 使用示例:
myLocalStorage.setItem('name', 'Gemini', 10000); // 10 秒后过期
console.log(myLocalStorage.getItem('name')); // 输出: Gemini

setTimeout(() => {
  console.log(myLocalStorage.getItem('name')); // 10 秒后,输出: null
}, 10000);


myLocalStorage.setItem('age', 2, 5000); // 5 秒后过期
console.log(myLocalStorage.getItem('age')); // 输出:2

myLocalStorage.removeItem('age');
console.log(myLocalStorage.getItem('age')); // 输出:null

方法二:分别存储数据和过期时间

这种方法将数据和过期时间分别存储在 localStorage 中,使用相同的 key 但添加后缀区分。

const myLocalStorage = {
  setItem(key, value, expirationTime) {
    localStorage.setItem(key, value);
    localStorage.setItem(`${key}_expiry`, new Date().getTime() + expirationTime);
  },

  getItem(key) {
    const expiry = localStorage.getItem(`${key}_expiry`);
    if (!expiry || new Date().getTime() > expiry) {
      localStorage.removeItem(key);
      localStorage.removeItem(`${key}_expiry`);
      return null;
    }
    return localStorage.getItem(key);
  },

  removeItem(key) {
    localStorage.removeItem(key);
    localStorage.removeItem(`${key}_expiry`);
  },

  clear() {
    localStorage.clear();
  }
};

// 使用示例:
myLocalStorage.setItem('name', 'Gemini', 10000); // 10 秒后过期
console.log(myLocalStorage.getItem('name')); // 输出: Gemini

setTimeout(() => {
  console.log(myLocalStorage.getItem('name')); // 10 秒后,输出: null
}, 10000);

两种方法的比较:

  • 方法一 更简洁,将数据和过期时间存储在一起,更易于管理。
  • 方法二 需要存储两条数据,占用略多的存储空间,但读取速度可能会略快一些,因为不需要 JSON.parse 操作。

选择哪种方法取决于具体需求和偏好。 两种方法都实现了带有过期时间的 localStorage 模拟。 记住,这只是模拟 localStorage 的行为,实际存储仍然依赖于浏览器原生的 localStorage

希望以上信息对您有所帮助!

标签:getItem,过期,myLocalStorage,localStorage,key,removeItem,模拟
From: https://www.cnblogs.com/ai888/p/18593051

相关文章

  • 零知开源——使用 GPIO 模拟时序驱动 WS2812B LED 灯带
    利用零知增强版的GPIO模拟时序       在本教程中,我们将探讨如何使用零知增强版的GPIO接口来模拟WS2812BLED灯带的信号传输时序,从而实现对单色或多彩LED灯带的控制。这种技术允许我们避开专用驱动库,直接与硬件进行交互,理解并掌握WS2812B的通信机制。一、工......
  • 透彻理解并解决Mockito模拟框架的单元测试无法运行的问题
    本篇的实例基于MavenIDE(VSCode)运行在VSCode运行的时候,不需要在pom.xml中添加任何插件就可以在测试类中看到如下的绿色按钮,单击就可以运行使用Mockito注解@ExtendWith(MockitoExtension.class)或是Mockito代码方式的测试。不使用注解:***Copyright(C)......
  • 华为OD E卷(200分)02-模拟目录管理
    题目描述        实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。        支持命令:创建目录命令:mkdir目录名称,如mkdirabc为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作。此命令无输出。进入目录命令:cd目......
  • 37 基于STM32的电压检测WIFI模拟
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32单片机,通过滑动变阻器模拟电压传感器检测电压,通过12864显示显示电压和电压阈值,按键可以控制阈值的增加,并通过串口实时显示相关参数和状态二、硬件资源基于KEIL5编写C++代码,PROTEUS8.15......
  • 37 基于STM32的电压检测WIFI模拟
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32单片机,通过滑动变阻器模拟电压传感器检测电压,通过12864显示显示电压和电压阈值,按键可以控制阈值的增加,并通过串口实时显示相关参数和状态二、硬件资源基于KEIL5编写C++代码,PROTEUS8.15......
  • 37 基于STM32的电压检测WIFI模拟
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32单片机,通过滑动变阻器模拟电压传感器检测电压,通过12864显示显示电压和电压阈值,按键可以控制阈值的增加,并通过串口实时显示相关参数和状态二、硬件资源基于KEIL5编写C++代码,PROTEUS8.15......
  • 37 基于STM32的电压检测WIFI模拟
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32单片机,通过滑动变阻器模拟电压传感器检测电压,通过12864显示显示电压和电压阈值,按键可以控制阈值的增加,并通过串口实时显示相关参数和状态二、硬件资源基于KEIL5编写C++代码,PROTEUS8.15......
  • 三门问题的python代码模拟和原理解释
    三门问题的python代码模拟和原理解释刷视频时偶然刷到了三门问题,于是好奇的查阅了一下先给出三门问题的简单介绍(引用自百度):三门问题(MontyHallproblem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’sMakeaDeal。问题名字来自该节目......
  • 如何在x86模拟器和鸿蒙API9如何使用MQTT模块ohos_mqtt
    目录引言安装失败的原因如何编译so文件的x86_64版本下载源代码 安装NDK代码编译安装MQTT软件包避免MQTT软件包自动升级设置libs客户端程序的编写运行测试结语参考文献引言在上周的博客(如何在鸿蒙API9和x86模拟器中使用MQTT-CSDN博客)中介绍了我的学生有个需求......
  • adb发送点击模拟-wjdr
    importsubprocessimportrandomimporttimeimportkeyboardimporttkinterastkimportthreadingimportconfigparserfromtkinterimportfont#创建ConfigParser对象config=configparser.ConfigParser()#读取config.ini文件config.read('config.ini')......