请求数据=>本地有无缓存+缓存数据是否过期

=>可用

=>不可用

将代码封装成一个DataStore.js文件, 这里面主要提供:从本地获取数据,从网络获取数据,创建本地时间戳,请求数据入口

import {AsyncStorage} from 'react-native';

export default class DataStore{

  // 保存数据
saveData(url,data,callback){
if(!data || !url) return;
AsyncStorage.setItem(url,JSON.stringify(this._wrapData(data)),callback);
}
_wrapData(data){
return {data:data, timestamp:new Date().getTime()};
}
//获取本地数据
fetchLocalData(url){
return new Promise((resolve,reject) => {
AsyncStorage.getItem(url,(error,result) => {
if(!error){
try{
resolve(JSON.parse(result));
}
catch(e){
reject(e);
console.error(e);
}
}
else {
reject(error);
console.error(error);
}
})
})
} //离线缓存的入口
fetchData(url){ return new Promise((resolve,reject) => {
this.fetchLocalData(url)
.then((wrapData) => {
if(wrapData && DataStore.chekTimestampValid(wrapData.timestamp)){
resolve(wrapData);
}
else{
this.fetchNetData(url)
.then((data)=>{
resolve(this._wrapData(data));
})
.catch((error)=>{
reject(error);
})
}
})
.catch((error)=>{
this.fetchNetData(url)
.then((data)=>{
resolve(this._wrapData(data));
})
.catch((error=>{
reject(error);
}))
})
})
} //本地缓存数据有效期检查
static chekTimestampValid(timestamp){
const currentDate = new Date();
const targetDate = new Date();
targetDate.setTime(timestamp);
if(currentDate.getMonth() !== targetDate.getMonth()) return false;
if(currentDate.getDate() !== targetDate.getDate()) return false;
if(currentDate.getHours() - targetDate.getHours() > 4) return false; return true;
} //获取网络数据
fetchNetData(url){
return new Promise((resolve,reject)=>{
fetch(url)
.then((response)=>{
if(response.ok){
return response.json();
}
throw new Error('Network response not ok');
})
.then((responseData)=>{
this.saveData(url,responseData)
resolve(responseData);
})
.catch((error)=>{
reject(error);
})
})
} }

效果图主要展示:前后请求数据的时间不变,因为没有超过过期时间

react native之封装离线缓存框架的更多相关文章

  1. React Native之携程Moles框架

    因为支持用javascript开发原生应用,React Native一推出就受到不少公司热捧,各家都跃跃欲试.但有一个痛点是,在移动端,我们是否有必要开发多套程序:iOS.Android和H5?本次将 ...

  2. [RN] React Native 使用 AsyncStorage 存储 缓存数据

    React Native 使用 AsyncStorage 存储 缓存数据 AsyncStorage是一个简单的.异步的.持久化的Key-Value存储系统,它对于App来说是全局性的.这是官网上对它的 ...

  3. React Native之基于AsyncStorage的离线缓存框架设计

    1.为什么要离线缓存? 宏观上来说: 提升用户体验: 我们要为用户提供流畅的APP操作体验,但我们无法保证所有用户的网络流畅度是好的,所以我们需要离线缓存来提升用户体验. 节省流量: 节省流量又分为两 ...

  4. React Native实践之携程Moles框架

    编者:本文来自携程框架研发部高级经理魏晓军在第二期[携程技术微分享]上的分享,以下为整理后的文字实录.视频回放可点击这里.关注携程技术中心微信公号ctriptech,可获知更多微分享课程信息. 因为支 ...

  5. React Native封装Toast与加载Loading组件

    React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...

  6. 跨平台框架与React Native基础

    跨平台框架 什么是跨平台框架? 这里的多个平台一般是指 iOS 和 Android . 为什么需要跨平台框架? 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平 ...

  7. Hybrid App 和 React Native 开发那点事

    简介:Hybrid App(混合模式移动应用)开发是指介于Web-app.Native-App这两者之间的一种开发模式,兼具「Native App 良好用户交互体验的优势」和「Web App 跨平台开 ...

  8. 使用React Native来撰写跨平台的App

    React Native 是一个 JavaScript 的框架,用来撰写实时的.可原生呈现 iOS 和 Android 的应用.其是基于 React的,而 React 是 Facebook 的用于构建 ...

  9. 基于React Native的移动平台研发实践分享

    转载:http://blog.csdn.net/haozhenming/article/details/72772787 本文目录: 一.React Native 已经成为了移动前端技术的趋势 二.基 ...

随机推荐

  1. 【SpringMVC】---RequestMapping、Ant 路径、PathVariable 注解、HiddenHttpMethodFilter 过滤器、用 POJO 作为参数

    一.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...

  2. aiXcoder安装&使用

    1.官网下载 https://www.aixcoder.com/#/setting 1.1介绍 1.2选择对应的下载版本 1.3安装&注册(需关闭IDEA) 安装完进行手机/邮箱注册,下载对应 ...

  3. Vue中使用JSX语法

    一 项目结构 二 App组件 <template> <div id="app"> <fruit/> </div> </temp ...

  4. jmeter的cookie跨线程传递

    测试计划需要设置成独立运行每个线程组获取cookie需要先执行才能使接下来的cookie使用正确执行 登录线程组登录,使用正则表达式提取器提取所需cookie然后使用BeanShellPostProc ...

  5. 卷积神经网络应用于MNIST数据集分类

    先贴代码 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = inpu ...

  6. 使用 java.util.Properties 读取配置文件中的参数

    配置文件格式 如下的配置参数格式都支持: Key = ValueKey = Key:ValueKey :Value 用法 getProperty方法的返回值是String类型. //读取配置文件 Fi ...

  7. 获取客户机MAC地址 根据IP地址 获取机器的MAC地址 / 获取真实Ip地址

    [DllImport("Iphlpapi.dll")] private static extern int SendARP(Int32 dest, Int32 host, ref ...

  8. Strust2+POI导出exel表格且解决文件名中文乱码/不显示

    下载并导入项目[poi.3.17.jar] strust.xml <action name="returnLate_*" class="com.stureturnl ...

  9. js获取url中的参数(解决中文乱码)

    这个是封装好的方法: function getQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...

  10. Python设置

    1.中断程序执行 在命令行中中断正在执行的程序,ctrl c或者ctrl break 2.SyntaxError: Non-ASCII character 需要在最开始的地方加上 : #-*-codi ...