我如何设置 AsyncStorage 的到期日期 - 本机反应

How I can set expiration date for AsyncStorage - react native

我正在使用 React 本机异步存储,它运行良好,但在某些情况下,我必须为数据设置到期日期并刷新我检查过的存储

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

唯一可用的选项是:-

AsyncStorage.removeItem 

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

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

首先,我存储的是对象,而不是字符串,所以我的解决方案将基于对象大小写,如果有人使用字符串,他可以将 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;
}

你也可以使用这个,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;
  }
}