精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官: 如何讓localStorage支持過期時間設置?

開發 前端
localStorage 屬性允許我們訪問一個 Document 源(origin)的對象 Storage;存儲的數據將保存在瀏覽器會話中。

[[440024]]

聊到 localStorage 想必熟悉前端的朋友都不會陌生, 我們可以使用它提供的 getItem, setItem, removeItem, clear 這幾個 API 輕松的對存儲在瀏覽器本地的數據進行讀,寫, 刪操作, 但是相比于 cookie, localStorage 唯一美中不足的就是不能設置每一個鍵的過期時間。

localStorage 屬性允許我們訪問一個 Document 源(origin)的對象 Storage;存儲的數據將保存在瀏覽器會話中。localStorage 類似 sessionStorage,但其區別在于:存儲在 localStorage 的數據可以長期保留;而當頁面會話結束——也就是說,當頁面被關閉時,存儲在 sessionStorage 的數據會被清除 。

我們還應注意,localStorage 中的鍵值對總是以字符串的形式存儲。

問題描述

在實際的應用場景中, 我們往往需要讓 localStorage 設置的某個 key 能在指定時間內自動失效, 所以基于這種場景, 我們如何去解決呢?

1. 初級解法

對于剛熟悉前端的朋友, 可能會立馬給出答案:

  1. localStorage.setItem('dooring''1.0.0'
  2. // 設置一小時的有效期 
  3. const expire = 1000 * 60 * 60; 
  4. setTimeout(() => { 
  5.   localStorage.setItem('dooring'''
  6. }, expire) 

當然這種方案能解決一時的問題, 但是如果要設置任意鍵的有效期, 使用這種方案就需要編寫多個定時器, 維護成本極高, 且不利于工程化復用。

2. 中級解法

前端工程師在有一定的工作經驗之后, 往往會去考慮工程化和復用性的問題, 并對數據結構有了一定的了解, 所以可能會有接下來的解法:

  1. 用localStorage存一份{key(鍵): expire(過期時間)}的映射表
  2. 重寫localStorage API, 對方法進行二次封裝

類似的代碼如下:

  1. const store = { 
  2.   // 存儲過期時間映射 
  3.   setExpireMap: (key, expire) => { 
  4.     const expireMap = localStorage.getItem('EXPIRE_MAP') || "{}" 
  5.     localStorage.setItem( 
  6.       'EXPIRE_MAP',  
  7.       JSON.stringify({ 
  8.       ...JSON.parse(expireMap), 
  9.       key: expire 
  10.     })) 
  11.   }, 
  12.   setItem: (key, value, expire) => { 
  13.     store.setExpireMap(key, expire) 
  14.     localStorage.setItem(key, value) 
  15.   }, 
  16.   getItem: (key) => { 
  17.     // 在取值之前先判斷是否過期 
  18.     const expireMap = JSON.parse( 
  19.       localStorage.getItem('EXPIRE_MAP') || "{}" 
  20.     ) 
  21.     if(expireMap[key] && expireMap[key] < Date.now()) { 
  22.       return localStorage.getItem(key
  23.     }else { 
  24.       localStorage.removeItem(key
  25.       return null 
  26.     } 
  27.   } 
  28.   // ... 

眨眼一看這個方案確實解決了復用性的問題, 并且不同團隊都可以使用這個方案, 但仍然有一些缺點:

  • 對 store 操作時需要維護2份數據, 并且占用緩存空間
  • 如果 EXPIRE_MAP 誤刪除將會導致所有過期時間失效
  • 對操作過程缺少更靈活的控制(比如操作狀態, 操作回調等)

3. 高級解法

為了減少維護成本和空間占用, 并支持一定的靈活控制和容錯能力, 我們又應該怎么做呢?

這里筆者想到了兩種類似的方案:

  1. 將過期時間存到 key 中, 如 dooring|6000, 每次取值時通過分隔符“|”來將 key 和 expire 取出, 進行判斷
  2. 將過期時間存到 value 中, 如 1.0.0|6000, 剩下的同1

為了更具有封裝性和可靠性, 我們還可以配置不同狀態下的回調, 簡單實現如下:

  1. const store = { 
  2.   preId: 'xi-'
  3.   timeSign: '|-door-|'
  4.   status: { 
  5.     SUCCESS: 0, 
  6.     FAILURE: 1, 
  7.     OVERFLOW: 2, 
  8.     TIMEOUT: 3, 
  9.   }, 
  10.   storage: localStorage || window.localStorage, 
  11.   getKey: function (key: string) { 
  12.     return this.preId + key
  13.   }, 
  14.   setfunction ( 
  15.     key: string, 
  16.     value: string | number, 
  17.     time?: Date & number, 
  18.     cb?: (status: number, key: string, value: string | number) => void, 
  19.   ) { 
  20.     let _status = this.status.SUCCESS, 
  21.       _key = this.getKey(key), 
  22.       _time; 
  23.     // 設置失效時間,未設置時間默認為一個月 
  24.     try { 
  25.       _time = time 
  26.         ? new Date(time).getTime() || time.getTime() 
  27.         : new Date().getTime() + 1000 * 60 * 60 * 24 * 31; 
  28.     } catch (e) { 
  29.       _time = new Date().getTime() + 1000 * 60 * 60 * 24 * 31; 
  30.     } 
  31.     try { 
  32.       this.storage.setItem(_key, _time + this.timeSign + value); 
  33.     } catch (e) { 
  34.       _status = this.status.OVERFLOW; 
  35.     } 
  36.     cb && cb.call(this, _status, _key, value); 
  37.   }, 
  38.   get: function ( 
  39.     key: string, 
  40.     cb?: (status: number, value: string | number | null) => void, 
  41.   ) { 
  42.     let status = this.status.SUCCESS, 
  43.       _key = this.getKey(key), 
  44.       value = null
  45.       timeSignLen = this.timeSign.length, 
  46.       that = this, 
  47.       index
  48.       time
  49.       result; 
  50.     try { 
  51.       value = that.storage.getItem(_key); 
  52.     } catch (e) { 
  53.       result = { 
  54.         status: that.status.FAILURE, 
  55.         value: null
  56.       }; 
  57.       cb && cb.call(this, result.status, result.value); 
  58.       return result; 
  59.     } 
  60.     if (value) { 
  61.       index = value.indexOf(that.timeSign); 
  62.       time = +value.slice(0, index); 
  63.       if (time > new Date().getTime() || time == 0) { 
  64.         value = value.slice(index + timeSignLen); 
  65.       } else { 
  66.         (value = null), (status = that.status.TIMEOUT); 
  67.         that.remove(_key); 
  68.       } 
  69.     } else { 
  70.       status = that.status.FAILURE; 
  71.     } 
  72.     result = { 
  73.       status: status, 
  74.       value: value, 
  75.     }; 
  76.     cb && cb.call(this, result.status, result.value); 
  77.     return result; 
  78.   }, 
  79.   // ... 
  80. }; 
  81.  
  82. export default store; 

這樣, 我們就實現了每個 key 都有獨立的過期時間, 并且對不同的操作結果可以輕松的進行狀態管控啦~

4. 骨灰級解法

當然, 骨灰級解法是直接使用 xijs 這個 javascript 工具庫, 因為我已經將上述完整實現方案封裝到該庫中了, 我們只需要使用如下的方案, 就能輕松使用具有過期時間的強大的 localStorage 方法啦 :

  1. //  先安裝 yarn add xijs 
  2. import { store } from 'xijs'
  3. // 設置帶有過期時間的key 
  4. store.set('name''dooring'Date.now() + 1000); 
  5. console.log(store.get('name')); 
  6. setTimeout(() => { 
  7.   console.log(store.get('name')); 
  8. }, 1000); 
  9.  
  10. // 設置成功后的回調 
  11. store.set('dooring''xuxiaoxi'Date.now() + 1000, (status, key, value) => { 
  12.   console.log('success'); 
  13. }); 

同時 xijs 還在持續擴充更有用的工具函數, 讓業務開發更高效. 目前已集成了如下工具函數:

  • store 基于 localStorage 上層封裝的支持過期時間設置的緩存庫, 支持操作回調
  • uuid 生成唯一id, 支持設置長度
  • randomStr 生成指定個數的隨機字符串
  • formatDate 開箱即用的時間格式化工具
  • debounce 防抖函數
  • throttle 節流函數
  • url2obj 將url字符串轉換為對象
  • obj2url 將對象轉換成編碼后的url字符串
  • isPC 判斷設備是否為PC類型

本文轉載自微信公眾號「趣談前端」

【編輯推薦】

 

責任編輯:姜華 來源: 趣談前端
相關推薦

2024-05-09 10:33:14

JS計算容量

2015-08-13 10:29:12

面試面試官

2024-04-09 08:39:16

本地緩存開發線程安全

2023-02-16 08:10:40

死鎖線程

2024-04-08 10:35:59

JS代碼容量

2024-12-26 10:19:16

2024-02-20 14:10:55

系統緩存冗余

2024-03-18 14:06:00

停機Spring服務器

2024-09-11 22:51:19

線程通訊Object

2025-03-17 00:00:00

2024-04-03 00:00:00

Redis集群代碼

2010-08-12 16:28:35

面試官

2021-07-06 07:08:18

管控數據數倉

2023-11-20 10:09:59

2021-03-01 18:42:02

緩存LRU算法

2019-07-23 09:30:17

HTTP 2.0HTTP協議傳輸

2024-04-23 14:09:59

JavaScript開發

2019-04-29 14:59:41

Tomcat系統架構

2021-02-06 09:21:17

MySQL索引面試

2022-05-23 08:43:02

BigIntJavaScript內置對象
點贊
收藏

51CTO技術棧公眾號

中文精品久久| www.国产视频| 狼人精品一区二区三区在线| 黄色成人在线播放| 精品视频一区二区| 亚洲天堂五月天| 重囗味另类老妇506070| 亚洲精品在线一区二区| 国产av无码专区亚洲精品| 成人综合影院| 国产精品一区在线观看你懂的| 欧美激情视频在线观看| 黄色短视频在线观看| 成人免费在线观看视频| 亚洲影视在线观看| 五月婷婷综合色| 亚洲精品无码久久久| 日韩黄色免费电影| 久久久久久网站| 亚洲综合第一区| 加勒比色综合久久久久久久久 | 美日韩一二三区| 亚洲国产一成人久久精品| 日韩精品在线看| 国产男女无遮挡猛进猛出| 欧美成人影院| 亚洲成av人片在www色猫咪| 亚洲精品国产精品国自产观看| 黄频网站在线观看| 国产一区二区三区四区五区美女 | 可以免费看的av毛片| 亚洲澳门在线| 最近2019免费中文字幕视频三| 熟妇高潮一区二区| 日本综合精品一区| 欧美调教femdomvk| 国产无套内射久久久国产| 精品精品导航| 亚洲欧美国产77777| 日本一区二区三区视频免费看| 免费看黄色一级视频| 久久91精品久久久久久秒播| 国产福利成人在线| www成人在线| 亚洲经典三级| 久久免费视频在线| 久草网视频在线观看| 99视频精品全部免费在线视频| 亚洲人午夜色婷婷| 插吧插吧综合网| 亚洲国产合集| 日韩精品有码在线观看| 五月婷婷综合在线观看| 国产精品一线| 亚洲国产婷婷香蕉久久久久久| 日批视频免费看| caoporn成人| 亚洲精品在线观| 成人欧美精品一区二区| aaa国产精品| 欧美精品一区二| 你懂的在线观看网站| 欧美巨大xxxx| 亚洲色图偷窥自拍| 欧美精品日韩在线| 欧美成人直播| 欧美精品手机在线| 久久免费在线观看视频| 亚洲看片一区| 日本乱人伦a精品| 青青艹在线观看| 老色鬼精品视频在线观看播放| 国产精品中文久久久久久久| 国产精品久久久久精| 国产一区二区三区免费观看| 99视频免费观看蜜桃视频| 性色av蜜臀av| 26uuu色噜噜精品一区| 欧洲国产精品| 国产色在线观看| 亚洲国产精品久久人人爱蜜臀| 妞干网在线观看视频| 欧美人体一区二区三区| 欧美日韩激情一区| 亚洲美女高潮久久久| 卡一精品卡二卡三网站乱码 | 国产不卡一区二区在线观看| 欧洲成人一区二区三区| 久久蜜桃av一区精品变态类天堂 | 丝袜美腿亚洲一区二区图片| 日韩免费在线看| 国产精品久久久久久久久久久久久久久久久久 | 成人情趣视频| 欧美日本精品在线| 日本三级一区二区| 久久99久久久久| 国产在线播放一区二区| 经典三级在线| 一区二区三区在线视频播放| 黄色一级片播放| 国产精品黄色片| 亚洲成人av片在线观看| 娇妻被老王脔到高潮失禁视频| 91精品国产视频| 秋霞成人午夜鲁丝一区二区三区| 亚洲天堂中文在线| 成人av网站在线| 一区二区日本伦理| 中文字幕成在线观看| 欧美一区二区国产| 国产精品理论在线| 夜夜精品视频| 91在线观看免费高清| 可以在线观看的黄色| 亚洲精品高清在线| 污版视频在线观看| 亚洲三级网址| 欧美激情奇米色| 国产又黄又猛又爽| 久久久久久久久久久久久久久99 | 神马午夜伦理不卡| 欧美探花视频资源| 人妻熟女aⅴ一区二区三区汇编| 亚洲美女视频| 国产精品亚发布| 台湾av在线二三区观看| 亚洲尤物视频在线| 天天久久综合网| 日韩电影免费网址| 国产精品va在线| 天天躁日日躁狠狠躁伊人| 亚洲精品日韩专区silk| 粉色视频免费看| 国产99精品| 全亚洲最色的网站在线观看| 婷婷在线免费观看| 亚洲精品久久嫩草网站秘色| 欧美男女交配视频| re久久精品视频| 国产成人免费av电影| 涩涩视频免费看| 一级片视频免费看| 久久久久久一区二区| 国产视色精品亚洲一区二区| 青草视频在线免费直播 | 五月天激情婷婷| 亚洲一区免费在线观看| 中文字幕亚洲日本| 亚洲激情中文在线| 3d蒂法精品啪啪一区二区免费| 午夜老司机在线观看| 欧美日韩一区三区| 网爆门在线观看| 精品一区二区三区日韩| 一区二区三区四区视频在线| 欧美日韩免费电影| 久久精品国产清自在天天线 | 久久99国产乱子伦精品免费| 亚洲欧美日产图| 亚洲精品三区| 欧美噜噜久久久xxx| av在线亚洲天堂| 一区二区不卡在线播放| www.黄色网| 亚洲美女啪啪| 欧美一区二区三区四区在线观看地址 | www.四虎成人| 成人6969www免费视频| 国产精品一区二区久久精品| 日本三级视频在线观看| 91麻豆精品国产91久久久久| 欧美精品99久久久| 成人av第一页| 妺妺窝人体色www在线观看| 91视频一区| 亚洲影院色无极综合| 91桃色在线| 国产亚洲精品久久久久久| 欧美特级aaa| 网红女主播少妇精品视频| 日本不卡高字幕在线2019| 成年人视频免费在线观看| 欧美日韩国产高清一区二区三区 | 91精品国产免费| 国产真实乱偷精品视频| 国产在线精品视频| 在线视频不卡国产| 成人亚洲综合| 久久久av亚洲男天堂| 狠狠综合久久av一区二区| 岛国av一区二区在线在线观看| 日韩网站在线免费观看| eeuss鲁一区二区三区| 国产精品看片你懂得| 永久免费黄色片| 亚洲精品一级| 蜜桃视频日韩| 久久天堂久久| 国产精品成av人在线视午夜片| 国内外激情在线| 日韩电影网在线| 国产巨乳在线观看| 色网综合在线观看| 亚洲欧美国产精品va在线观看| 熟女少妇内射日韩亚洲| 国产高清在线精品| 亚洲成人福利在线观看| 懂色av一区二区| 欧美亚洲激情在线| 成人h动漫精品一区二区无码 | 日韩在线电影一区| 午夜国产在线观看| 一道本成人在线| 久久久久黄色片| 欧美国产视频在线| 人体私拍套图hdxxxx| 国产精品美女| 丰满人妻一区二区三区53号| 国产伦精品一区二区三区在线播放 | 婷婷久久国产对白刺激五月99| 青草青草久热精品视频在线观看| 91网在线播放| 亚洲免费小视频| 亚洲免费一级片| 欧美日韩国产高清一区二区三区 | 久久99久久99精品蜜柚传媒| 国产成人77亚洲精品www| 亚洲全黄一级网站| 好吊色在线观看| 欧美一区二区三区色| 日韩精品一卡二卡| 最新国产成人在线观看| 四虎永久免费在线观看| 亚洲欧美日韩国产一区二区| 日韩不卡一二区| 四虎国产精品永久在线国在线| 国产成人精品久久二区二区| 日本视频在线免费观看| 中文欧美在线视频| 五月激情婷婷综合| 日韩av一区在线| 中文在线第一页| 疯狂做受xxxx高潮欧美日本| 欧美三级免费看| 综合av第一页| 中文精品在线观看| 久久中文字幕电影| 亚洲精品成人无码| 久久久久久久久久久久久久久99| 成年人在线观看av| 色综合888| 色综合久久中文字幕综合网 | 1区2区3区在线观看| 亚洲人成网站999久久久综合| 黄网站在线观看| 在线播放亚洲激情| 天天操天天干天天爽| 亚洲国语精品自产拍在线观看| 国产真实乱偷精品视频| 天天综合网天天综合色| 日韩精品在线免费视频| 色综合咪咪久久| 日本老熟俱乐部h0930| 一区二区三区在线观看视频| 精品在线视频免费| 亚洲国产婷婷综合在线精品| 精品视频一区二区在线观看| 国产精品久久午夜| 日韩激情综合网| 夜夜精品视频一区二区| 日韩欧美不卡视频| 在线免费一区三区| 美女扒开腿免费视频| 俺来也官网欧美久久精品| 欧美激情手机在线视频 | 亚洲国产婷婷综合在线精品| 中国一级特黄毛片| 欧美在线免费观看视频| 国产孕妇孕交大片孕| 日韩精品一区在线观看| 欧美综合视频在线| 国产亚洲欧美视频| 9i精品一二三区| 久久久精品一区二区| jizz一区二区三区| 国产成人精品免费视频| 精品国产一级| 精品一区在线播放| 欧美成人激情| 无码人妻精品一区二区三区在线 | 国产噜噜噜噜噜久久久久久久久| 变态调教一区二区三区| 国产精品亚洲第一区| 精品av导航| 制服诱惑一区| 国产精品嫩草99av在线| 丝袜老师办公室里做好紧好爽| 狠狠久久婷婷| 亚洲欧美视频二区| av在线一区二区三区| 极品美妇后花庭翘臀娇吟小说| 亚洲影院久久精品| 91中文字幕在线播放| 亚洲精品一区二区三区福利 | 视频精品一区| 91久久极品少妇xxxxⅹ软件| 国产精品美女久久久久久不卡| 91久久国产最好的精华液| 国产精品视频中文字幕| 久久久夜夜夜| 在线看免费毛片| 91蜜桃网址入口| 深夜福利影院在线观看| 在线观看网站黄不卡| 亚洲精品第五页| 国产一区二区三区日韩欧美| 国产盗摄精品一区二区酒店| 国产欧美精品日韩精品| 99re6热只有精品免费观看| 婷婷五月色综合| 免费日韩av片| 亚洲午夜久久久久久久久| 综合在线观看色| 日韩成人高清视频| 日韩欧美一区在线| 第一福利在线| 欧美一级免费看| 欧美黑白配在线| 国产精品videossex国产高清| 久久精品国产77777蜜臀| 国产激情在线免费观看| 激情懂色av一区av二区av| 精品国产伦一区二区三区| 日韩在线国产精品| 天堂av中文在线观看| 国产亚洲福利社区| 亚洲福利免费| 亚洲麻豆一区二区三区| 一区二区三区成人| 99re只有精品| 深夜福利日韩在线看| 黄在线观看免费网站ktv| 国产丝袜不卡| 亚洲少妇自拍| 少妇按摩一区二区三区| 欧美日韩国产中文字幕| 三级毛片在线免费看| 欧美一级淫片aaaaaaa视频| 亚州精品视频| mm1313亚洲国产精品无码试看| 99re热视频这里只精品| 日韩黄色在线播放| 亚洲精品小视频在线观看| 惠美惠精品网| 色综合视频二区偷拍在线| 免费观看久久久4p| 亚洲精品久久久久久国| 欧美一区二区三区婷婷月色| 色呦呦在线免费观看| 国产精品一区二区三区精品| 亚洲国产精品第一区二区| 7788色淫网站小说| 日本高清视频一区二区| 97在线观看免费观看高清 | 国产欧美一区二区精品秋霞影院| 老熟妇一区二区三区| 色老头一区二区三区| 韩国三级大全久久网站| 日韩精品一区在线视频| 久久久久久夜精品精品免费| 中文字幕av在线免费观看| 久久久国产精品亚洲一区| 大型av综合网站| 国产精品动漫网站| 国产精品久久久久久久久免费樱桃| 国产欧美日韩成人| 久久久久亚洲精品| 国产一区99| 一区二区三区国产好的精华液| 亚洲综合一区二区精品导航| 十九岁完整版在线观看好看云免费| 国产精品久久久久久久久久东京| 亚洲成av人片一区二区密柚| 中文字幕乱码一区| 欧美特级限制片免费在线观看| www.久久ai| 欧美日韩免费精品| 国产一区欧美二区| 999这里只有精品| 精品国产欧美成人夜夜嗨| 久久亚洲黄色| 伊人国产精品视频| 欧美丝袜一区二区三区| 久cao在线| 久久国产一区二区| 国产盗摄视频一区二区三区| 欧美一区二区三区网站| 欧美精品一区三区| 精品久久久久久久| 久久久久久久人妻无码中文字幕爆|