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

=>可用

=>不可用

将代码封装成一个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. 【Qt开发】【Linux开发】调试记录:QFontDatabase::loadFromCache Error

    最近做嵌入式的Qt界面,在移植成功后遇到了一个问题:QFontDatabase::loadFromCache: Font path doesn't match.后面跟着便是两个路径. 解决方案就是对比 ...

  2. 第十一周总结 继承、this和super的区别和用法、方法的重写和重载

    一.继承 1.子类继承父类,通过一个关键字 extends 2.子类的对象可以调用父类中的(public protected)属性和方法 当作自己的来使用 3.子类可以添加自己独有的属性和方法 4.子 ...

  3. Jmeter响应数据显示乱码问题

    Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码,原因应该是响应页面没有做编码处理,jmeter默认按照ISO-8859-1编码格式进行解析. 解决步骤: 现象:jmeter访问本地文件 ...

  4. MyBatis框架 课程笔记

    MyBatis框架 课程笔记   第1章 MyBatis简介 1.1 MyBatis历史 1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Softw ...

  5. 用nopcomerce3.8版本的同行注意了,前2天发布3.8正式版后,作者收到一些BuG,作者修复后重新提供了一个源代码包下载.

    用nopcomerce3.8版本的同行注意了,前2天发布3.8正式版后,作者收到一些BuG,作者修复后重新提供了一个源代码包下载地址,不是github上的那个链接.去作者官网论坛我那个链接地址,或关注 ...

  6. luogu P1232 [NOI2013]树的计数

    传送门 这题妙蛙 首先考虑构造出一个合法的树.先重新编号,把bfs序整成\(1,2,3...n\),然后bfs序就是按照从上到下从左往右的遍历顺序,所以可以考虑对bfs序分层,可以知道分层方式只会对应 ...

  7. Android 开发环境部署

    引言   在windows安装Android的开发环境不简单也说不上算复杂,本文写给第一次想在自己Windows上建立Android开发环境投入Android浪潮的朋友们,为了确保大家能顺利完成开发环 ...

  8. 封装自己的framework静态库

    ios中我们写的代码有时不愿意让别人看到,可能对它进行封装,生成一个静态库如典型的.a,还有一种就是和 苹果自带的库一样的后缀名为.framework的库,个人推荐使用.framework,因为.a不 ...

  9. 面试官:SpringBoot jar 可执行原理,知道吗?

    文章篇幅较长,但是包含了SpringBoot 可执行jar包从头到尾的原理,请读者耐心观看.同时文章是基于 SpringBoot-2.1.3进行分析.涉及的知识点主要包括Maven的生命周期以及自定义 ...

  10. noip级别模板小复习

    不是很noip的知识点就不写了. dij什么的太easy就不写了. 缩点 注意\(Tarjan\)在缩边双和求强联通分量时候的区别. 一个要判断是否在栈内一个不要. 最后\(topsort\)来\(d ...