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

=>可用

=>不可用

将代码封装成一个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. 郝斌_GUI

    85事件处理 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java ...

  2. Android下Native的so编译:使用cmakelists.txt

    android studio的CMakeLists.txt写好后,在Studio中编译没问题,在命令编译时则需要配置很多参数才能成功 示例CMakeLists.txt文件: cmake_minimum ...

  3. Java ——扩展:内部类 匿名内部类 IO file 设计模式

    内部类的拓展 定义类or方法内部的类 最外层的类只能使用public和默认修饰 class Demo { class A { } public static void main(String[] ar ...

  4. 学习kettle遇到的问题

    一. 解决mysql连接缺少驱动问题:http://www.mamicode.com/info-detail-1724584.html 1.下载驱动 https://dev.mysql.com/dow ...

  5. 【Linux开发】./configure,make,make install的作用

    这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤. ./configure是用来检测你的安装平台的目标特征的.比如它会检测你是不是有CC或GCC,并不是需要CC或GCC ...

  6. 【Linux开发】Ubuntu下几个软件的配置记录backup

    调用ubuntu命令行的方法:ctrl+alt+t gcc -o test test.c 开发工具包括eclipse,Qt等全部放入了/opt/路径下,java开发环境放在了/usr/local/jd ...

  7. kafka学习(二)

    创建kafka生产者 要往kafka写入消息,首先要创建一个生产者对象,并设置一些熟悉.kafka生产者有3个必选的属性.   1.bootstrap.servers 该属性指定broker的地址清单 ...

  8. Springboot2.x集成单节点Redis

    Springboot2.x集成单节点Redis 说明 在Springboot 1.x版本中,默认使用Jedis客户端来操作Redis,而在Springboot 2.x 版本中,默认使用Lettuce客 ...

  9. Hive-java.lang.ClassNotFoundException: org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe

    Task with the most failures(): ----- Task ID: task_1555476136794_8201_m_000000 URL: http://hadoop1:8 ...

  10. 【监控笔记】【3.1】DML(CDC)、DDL(DDL触发器)跟踪数据更改,数据库审计

    关键词:数据库审计.DDL审计.DML审计 [监控笔记][3.1]DML(CDC).DDL(DDL触发器)跟踪数据更改 [1]DML(CDC) 2008及以上 https://www.cnblogs. ...