【问题标题】:How I can set expiration date for AsyncStorage - react native我如何设置 AsyncStorage 的到期日期 - 反应原生
【发布时间】:2017-11-28 17:03:48
【问题描述】:

我正在使用 react native 异步存储,它工作得很好,但在某些情况下,我必须为数据设置过期日期并刷新我检查过的存储

AsyncStorage documentation 但没有选项可以设置在特定时间后过期。

唯一可用的选项是:-

AsyncStorage.removeItem 

【问题讨论】:

    标签: react-native asyncstorage


    【解决方案1】:

    AsyncStorage 实际上只处理存储,除此之外什么都没有。

    如果您想设置过期时间,只需在您的数据中输入访问日期的密钥并将其设置为new Date()。然后,当您提取数据时,根据到期时间对到期密钥进行日期检查。

    【讨论】:

      【解决方案2】:

      首先,我存储的是对象,而不是字符串,所以我的解决方案将基于对象大小写,如果有人使用字符串,他可以附加 expireAt 对象键,然后他将提取过期日期并将其与当前日期进行比较

      我的解决方案:-

      /**
       *
       * @param urlAsKey
       * @param expireInMinutes
       * @returns {Promise.<*>}
       */
      async getCachedUrlContent(urlAsKey, expireInMinutes = 60) {
      
          let data = null;
      
          await AsyncStorage.getItem(urlAsKey, async (err, value) => {
      
              data = (JSON.parse(value));
      
              // there is data in cache && cache is expired
              if (data !== null && data['expireAt'] &&
                  new Date(data.expireAt) < (new Date())) {
      
                  //clear cache
                  AsyncStorage.removeItem(urlAsKey);
      
      
                  //update res to be null
                  data = null;
              } else {
      
                  console.log('read data from cache  ');
      
              }
          });
      
          //update cache + set expire at date
          if (data === null) {
              console.log('cache new Date ');
      
              //fetch data
              data = fetch(urlAsKey).then((response) => response.json())
                  .then(apiRes => {
      
                      //set expire at
                      apiRes.expireAt = this.getExpireDate(expireInMinutes);
      
                      //stringify object
                      const objectToStore = JSON.stringify(apiRes);
      
                      //store object
                      AsyncStorage.setItem(urlAsKey, objectToStore);
      
      
                      console.log(apiRes.expireAt);
                      return apiRes;
                  });
      
          }
      
          return data;
      
      
      },
      
      /**
       *
       * @param expireInMinutes
       * @returns {Date}
       */
      getExpireDate(expireInMinutes) {
          const now = new Date();
          let expireTime = new Date(now);
          expireTime.setMinutes(now.getMinutes() + expireInMinutes);
          return expireTime;
      }
      

      【讨论】:

        【解决方案3】:

        您也可以使用它,从 Ahmed Farag Mostafa 的答案中改进

        import AsyncStorage from "@react-native-async-storage/async-storage";
        
        export default class ExpireStorage {
          static async getItem(key) {
            let data = await AsyncStorage.getItem(key);
            data = JSON.parse(data);
            if (
              data !== null &&
              data.expireAt &&
              new Date(data.expireAt) < new Date()
            ) {
              await AsyncStorage.removeItem(key);
              data = null;
            }
            return data?.value;
          }
        
          static async setItem(key, value, expireInMinutes) {
            const data = { value };
            if (expireInMinutes) {
              const expireAt = this.getExpireDate(expireInMinutes);
              data.expireAt = expireAt;
            } else {
              const expireAt = JSON.parse(await AsyncStorage.getItem(key))?.expireAt;
              if (expireAt) {
                data.expireAt = expireAt;
              } else {
                return;
              }
            }
            const objectToStore = JSON.stringify(data);
            return AsyncStorage.setItem(key, objectToStore);
          }
        
          static async removeItem(key) {
            return AsyncStorage.removeItem(key);
          }
        
          static getExpireDate(expireInMinutes) {
            const now = new Date();
            const expireTime = new Date(now);
            expireTime.setMinutes(now.getMinutes() + expireInMinutes);
            return expireTime;
          }
        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-03
          • 1970-01-01
          • 2019-11-02
          • 2011-11-04
          相关资源
          最近更新 更多