资讯专栏INFORMATION COLUMN

React Native 在用户网络故障时自动调取缓存

Simon / 2420人阅读

摘要:接口名称替换中的包裹的参数传给服务端的数据请求头参数返回请检查您的网络连接命名为请求配置为标示请求唯一性,我们需给每个请求取一个名称命名为请求调用我们可以模仿一下或的命名为调用原文地址在用户网络故障时自动调取缓存

App往往都有缓存功能,例如常见的新闻类应用,如果你关闭网络,你上次打开App加载的数据还在,只是不能加载新的数据了。

我的博客bougieblog.cn,欢迎前来尬聊。

集中处理请求

如果你fetch数据的页面有多个,不集中处理的话每个页面都要多带带进行缓存处理。那么,如何对http请求进行集中处理?
在WebApp中常见的做法就是将请求放在action里面,例如VuexRedux。但是在业务逻辑较少的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

请求调用

我们可以模仿一下VuexRedux的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在用户网络故障时自动调取缓存

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107796.html

相关文章

  • 来聊聊react-native应用的健康监控

    监控什么 今天我们来聊聊如何监控你的应用程序,这里的监控说的不是让我们去监控用户,而是监控应用的健康状态,什么是健康状态呢?对于后端的同学来说,在微服务的架构下,每个子服务是否正常工作、返回的结果是否满足预期,这些就算是健康状态,再举个例子,你的台式机,对于操作系统来说,每个硬件是否能正常的工作、工作的稳定性,这些都是需要关注的健康状态。 既然我们关心健康状态,那么我们该如何衡量一个设备的健康状态...

    tunny 评论0 收藏0
  • android知识大总结 - 收藏集 - 掘金

    摘要:中简单搞定接口访问,以及简析掘金最近总结的一些经验,对于或中使用接口的一些心得。这里,本文将数据结构之学习总结掘金前言前面介绍了的数据结构,今天抽空学习总结一下另一种数据结构。浅析事件传递掘金中的事件传递主要涉及三个方法和。 Android 系统中,那些能大幅提高工作效率的 API 汇总(持续更新中...) - 掘金前言 条条大路通罗马。工作中,实现某个需求的方式往往不是唯一的,这些不...

    luodongseu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<