国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

React Native 在用戶網(wǎng)絡(luò)故障時(shí)自動(dòng)調(diào)取緩存

Simon / 2436人閱讀

摘要:接口名稱替換中的包裹的參數(shù)傳給服務(wù)端的數(shù)據(jù)請(qǐng)求頭參數(shù)返回請(qǐng)檢查您的網(wǎng)絡(luò)連接命名為請(qǐng)求配置為標(biāo)示請(qǐng)求唯一性,我們需給每個(gè)請(qǐng)求取一個(gè)名稱命名為請(qǐng)求調(diào)用我們可以模仿一下或的命名為調(diào)用原文地址在用戶網(wǎng)絡(luò)故障時(shí)自動(dòng)調(diào)取緩存

App往往都有緩存功能,例如常見(jiàn)的新聞?lì)悜?yīng)用,如果你關(guān)閉網(wǎng)絡(luò),你上次打開App加載的數(shù)據(jù)還在,只是不能加載新的數(shù)據(jù)了。

我的博客bougieblog.cn,歡迎前來(lái)尬聊。

集中處理請(qǐng)求

如果你fetch數(shù)據(jù)的頁(yè)面有多個(gè),不集中處理的話每個(gè)頁(yè)面都要多帶帶進(jìn)行緩存處理。那么,如何對(duì)http請(qǐng)求進(jìn)行集中處理?
在WebApp中常見(jiàn)的做法就是將請(qǐng)求放在action里面,例如VuexRedux。但是在業(yè)務(wù)邏輯較少的App中,我們往往可能不需要Redux。這時(shí)就需要我們自己對(duì)集中請(qǐng)求進(jìn)行封裝。

封裝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

封裝公共請(qǐng)求函數(shù)

在網(wǎng)絡(luò)故障時(shí)獲取storage里的內(nèi)容,網(wǎng)絡(luò)良好時(shí)更新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中的{}包裹的參數(shù)
 * @param {Object} [data={}] 傳給服務(wù)端的數(shù)據(jù)
 * @param {Object} [headers={}] http請(qǐng)求頭參數(shù)
 * @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("請(qǐng)檢查您的網(wǎng)絡(luò)連接", 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

請(qǐng)求配置

為標(biāo)示請(qǐng)求唯一性,我們需給每個(gè)請(qǐng)求取一個(gè)名稱:

export default {
    GET_NEWS_LIST: {
        url: "/my/news?pageNum={pageNum}&pageSize={pageSize}",
        method: "get"
    }
}

命名為apiList.js

請(qǐng)求調(diào)用

我們可以模仿一下VuexRedux的action:

import $http from "./service"

export async function getNewsList(pageNum, pageSize) {
    return await $http({
        api: "GET_NEWS_LIST",
        replace: {
            pageNum,
            pageSize
        }
    })
}

命名為serviceAction.js
調(diào)用:

import {getNewsList} from "./serviceAction"

// ...
async componentDidMount() {
    let newsList = await getNewsList(1)
    this.setState({
        newsList
    })
}
// ...

原文地址:React Native在用戶網(wǎng)絡(luò)故障時(shí)自動(dòng)調(diào)取緩存

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/107796.html

相關(guān)文章

  • 來(lái)聊聊react-native應(yīng)用的健康監(jiān)控

    監(jiān)控什么 今天我們來(lái)聊聊如何監(jiān)控你的應(yīng)用程序,這里的監(jiān)控說(shuō)的不是讓我們?nèi)ケO(jiān)控用戶,而是監(jiān)控應(yīng)用的健康狀態(tài),什么是健康狀態(tài)呢?對(duì)于后端的同學(xué)來(lái)說(shuō),在微服務(wù)的架構(gòu)下,每個(gè)子服務(wù)是否正常工作、返回的結(jié)果是否滿足預(yù)期,這些就算是健康狀態(tài),再舉個(gè)例子,你的臺(tái)式機(jī),對(duì)于操作系統(tǒng)來(lái)說(shuō),每個(gè)硬件是否能正常的工作、工作的穩(wěn)定性,這些都是需要關(guān)注的健康狀態(tài)。 既然我們關(guān)心健康狀態(tài),那么我們?cè)撊绾魏饬恳粋€(gè)設(shè)備的健康狀態(tài)...

    tunny 評(píng)論0 收藏0
  • android知識(shí)大總結(jié) - 收藏集 - 掘金

    摘要:中簡(jiǎn)單搞定接口訪問(wèn),以及簡(jiǎn)析掘金最近總結(jié)的一些經(jīng)驗(yàn),對(duì)于或中使用接口的一些心得。這里,本文將數(shù)據(jù)結(jié)構(gòu)之學(xué)習(xí)總結(jié)掘金前言前面介紹了的數(shù)據(jù)結(jié)構(gòu),今天抽空學(xué)習(xí)總結(jié)一下另一種數(shù)據(jù)結(jié)構(gòu)。淺析事件傳遞掘金中的事件傳遞主要涉及三個(gè)方法和。 Android 系統(tǒng)中,那些能大幅提高工作效率的 API 匯總(持續(xù)更新中...) - 掘金前言 條條大路通羅馬。工作中,實(shí)現(xiàn)某個(gè)需求的方式往往不是唯一的,這些不...

    luodongseu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<