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 的用于构建 ...
随机推荐
- 关于64位操作系统使用C#访问注册表失败的问题
通过C#的注册表类 Registry.GetValue 进行访问时,其返回值一直为空.然后认真检查检查再检查了注册表路径,发现路径没有一点问题,不说废话,上代码: if (Registry.GetVa ...
- findwindow\sendmessage向第三方软件发送消息演示
这里仅仅是以putty作为演示消息发送机制和控件搜索机制 程序一:代填IP和端口,并建立远程连接 #include"stdafx.h"#include <windows.h& ...
- 通过XmlSerializer接口来生成xml文件
xml文件我们可以用来保存一些数据.例如用来备份短信.这个例子中,我们就用XmlSerializer接口来实现一个备份短信的程序.当然了,为了程序简单化,这个程序我们并不是真的去备份短信.我们通过一个 ...
- 【知识碎片】SQL篇
43.group by多个字段 查询每个班级男女生各多少人 Select count(id),xingbie,banji from tablename group by xingbie,banji 4 ...
- java连接字符串操作,可用来向sql传值
private static String concat(String tag,String Time) { // TODO Auto-generated method stub // return ...
- Pandoc+markdown生成slides
Pandoc+markdown生成slides 参考:http://blog.csdn.net/pizi0475/article/details/50955900 1.安装 http://pandoc ...
- with上下文管理基础
import queue import contextlib import time @contextlib.contextmanager def worker_state(xxx,val): xxx ...
- Alert---点击拍照弹出对话框
/** * 照片对话框 *AlertDialog */ private void PhotoDialog() { AlertDialog.Builder builder = new Builder(m ...
- activeMQ功能Demo
1. 请阐述ActiveMQ的作用 2. 请描述ActiveMQ的工作原理 1. 解决服务之间耦合 2. 使用消息队列,增加系统并发处理量 3. 使用Java程序编写生产者发送10条“你好,activ ...
- 面试题:Concurrenthashmap原理分析 有用
一.背景: 线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 效率低下的H ...