React Native 在用户网络故障时自动调取缓存
App往往都有缓存功能,例如常见的新闻类应用,如果你关闭网络,你上次打开App加载的数据还在,只是不能加载新的数据了。
我的博客bougieblog.cn,欢迎前来尬聊。
集中处理请求
如果你fetch数据的页面有多个,不集中处理的话每个页面都要单独进行缓存处理。那么,如何对http请求进行集中处理?
在WebApp中常见的做法就是将请求放在action里面,例如Vuex和Redux。但是在业务逻辑较少的App中,我们往往可能不需要Redux。这时就需要我们自己对集中请求进行封装。
封装AsyncStorage
AsyncStorage只能存取字符串,我们需封装一下,让它能存取json:
import { AsyncStorage } from 'react-native'
class Storage {
set({key, val}) {
return AsyncStorage.setItem(key, JSON.stringify(val))
}
get(key) {
return AsyncStorage.getItem(key).then(val => {
return JSON.parse(val)
})
}
remove(key) {
return AsyncStorage.removeItem(key)
}
clear() {
return AsyncStorage.clear()
}
}
export default new Storage()
命名为storage.js
封装公共请求函数
在网络故障时获取storage里的内容,网络良好时更新storage。
import axios from 'axios'
import storage from './storage'
import apiList from './apiList'
import {NetInfo, ToastAndroid} from 'react-native'
/**
* @param {String} api 接口名称
* @param {Object} [replace={}] 替换url中的{}包裹的参数
* @param {Object} [data={}] 传给服务端的数据
* @param {Object} [headers={}] http请求头参数
* @return {Promise} 返回promise
*/
const $http = async ({api, replace, data, headers}) => {
let regExp = /\{ *([\w_\-]+) *\}/g,
url = apiList[api].url,
replaceList = url.match(regExp)
if(replaceList) {
replaceList.forEach(i => {
let key = i.slice(1, i.length - 1)
url = url.replace(i, replace[key])
})
}
let netStatu = await NetInfo.getConnectionInfo()
let result
if(['none', 'unknown'].includes(netStatu.type)) {
ToastAndroid.show('请检查您的网络连接', ToastAndroid.SHORT)
result = await storage.get(api) || null
} else {
try {
let {data} = await axios({
method: apiList[api].method,
url: url,
data: data,
headers: headers
})
result = data
} catch(err) {
ToastAndroid.show(err.message, ToastAndroid.SHORT)
result = await storage.get(api) || null
}
await storage.set({
key: api,
val: result
})
}
return result
}
export default $http
命名为service.js
请求配置
为标示请求唯一性,我们需给每个请求取一个名称:
export default {
GET_NEWS_LIST: {
url: '/my/news?pageNum={pageNum}&pageSize={pageSize}',
method: 'get'
}
}
命名为apiList.js
请求调用
我们可以模仿一下Vuex或Redux的action:
import $http from './service'
export async function getNewsList(pageNum, pageSize) {
return await $http({
api: 'GET_NEWS_LIST',
replace: {
pageNum,
pageSize
}
})
}
命名为serviceAction.js
调用:
import {getNewsList} from './serviceAction'
// ...
async componentDidMount() {
let newsList = await getNewsList(1)
this.setState({
newsList
})
}
// ...
原文地址:React Native在用户网络故障时自动调取缓存
React Native 在用户网络故障时自动调取缓存的更多相关文章
- 从零学React Native之14 网络请求
通过HTTP或者HTTPS协议与网络侧服务器交换数据是移动应用中常见的通信方式. node-fetch是RN推荐的请求方式. React Native框架在初始化项目时, 引入了node-fetch包 ...
- React Native中的网络请求fetch和简单封装
React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...
- Firefox每次刷新时自动清空缓存的设置方法
当我们开发网页应用时候,为了保证每次看到的页面是最新的,需要在刷新页面时清除页面缓存. 如果每次都手动清除比较麻烦,好在多数浏览器都支持自动清除缓存的功能. IE下我们可以将缓存设置为"每次 ...
- shell监控网卡状态,故障时自动重启网卡
今天朋友找我写个监控网卡状态的脚本,要求在系统网卡挂了可以自己启动起来,这个要求是不是很bt,我考虑了半天,简单的写了个shell脚本来监控,实现原理是使用ping来测试网络连通性,如果不通就重启 ...
- Jquery 搜索等待用户输入完成时自动执行
$('#fuzzySearchBox').on('keyup', function (event) { var searchStr = $(this).val().toLowerCase(); //i ...
- 故障时自动重启Apache
最近不知道为什么博客总是莫名其妙地挂掉, 重启Apache就好了,我也懒得去研究到底是哪里出了问题. 只是每次都需要手工SSH上去重启Apache,有点麻烦. 而且有时候在夜里挂掉,一晚上博客就都不能 ...
- React Native在虚拟运行app时,报错RCTRootView not found,怎么解决?
报错: 解决方案:
- React Native探索(五)使用fetch进行网络请求
相关文章 React Native探索系列 前言 React Native可以使用多种方式来请求网络,比如fetch.XMLHttpRequest以及基于它们封装的框架,fetch可以说是替代XMLH ...
- 使用React Native来撰写跨平台的App
React Native 是一个 JavaScript 的框架,用来撰写实时的.可原生呈现 iOS 和 Android 的应用.其是基于 React的,而 React 是 Facebook 的用于构建 ...
随机推荐
- 查看,修改ceph节点的ceph配置命令
标签(空格分隔): ceph,ceph运维,ceph配置 查看ceph配置 1. 查看ceph默认配置: # ceph --show-config 2. 查看 type.num 的ceph默认配置: ...
- 以ed结尾的单词
1 规则动词词尾加-ed有三种读音 1.1 以清辅音结尾,加-ed 在清辅音后读作[ t ].如: ask → asked look → ...
- Android 4学习(6):概述 - 深入了解Android Activity
参考:<Professional Android 4 Application Development> 深入了解Android Activity 每一个Android Activity都对 ...
- DAY18-Django之form表单
构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...
- Android WebView 捕捉点击的URL中的信息
项目要求,在WebView中点击搜索关键字,加载其他Web页面时,需要在一个文本输入框中,实时显示关键字 事实上,这种点击,是WebView内的,并没有跳出这个WebView,Activity也没有经 ...
- Internet Intranet Extranet
Internet: There's only one of it, and you're on it now. Intranet: An internal network local to a com ...
- js中的各种宽高
在设计页面时可能经常会用到固定层的位置,这就需要获取一些html对象的坐标以更灵活的设置目标层的坐标,这里可能就会用到document .body.scrollTop等属性,但是此属性在xhtml标准 ...
- IDEA创建Maven Web 项目
前提:安装过maven并且配置了maven的环境变量,这里就不演示了.转载了别人一篇maven详解,不了解的可以先看一下这个 链接 图文讲解: 创建项目 选择Maven 选择创建webapp项目 指定 ...
- 关于handler的再次讨论
主要有两个问题,post方法和sendmessage方法有什么不同? 同一个handler对象发送的message只能发送给自己吗? 问题1: post方法,对于Handler的Post方式来说,它会 ...
- WINFORM 开发模式,窗体回到默认样式方法。
软件分为3类 客户端 网站应用 app WINFORM 主要用来只做客户端应用程序.C/S 客户端程序很重要的特点:可以操作用户电脑上的文件,执行在客户端上,电脑的配置越高执行就越流畅. 在p ...