vue中如何控制一个全局接口的调用频率

业务说明

在app.vue,created中调用了一个同步用户信息的接口,但不希望每个页面刷新都会调用,并限制在页面的调用频率

具体实现

js 复制代码
/**
 * 判断是否应该调用接口 白名单下的直接调用
 * @param {String} api_name 接口名字
 * @param {String} router_name 当前路由名字
 * @param {Array} routers_name 白名单路由名字
 * @param {Number} time 过期时间
 *
 * **/
export function getNeedApi(api_name = '', router_name, routers_name = [], time = 5 * 60 * 1000) {
    if (routers_name.includes(router_name)) {
        return true
    }
    let isFlag = false
    let now = Date.now()
    let needApi = sessionStorage.getItem(`needApi_${api_name}`)
    if (needApi) {
        needApi = JSON.parse(needApi)
        if (needApi.time && now - needApi.time > time) {
            isFlag = true
        }
    } else {
        isFlag = true
    }
    return isFlag
}

/**
 * 新增api访问记录
 * @param {String} api_name 接口名字
 * **/
export function postNeedApi(api_name = '') {
    let now = Date.now()
    sessionStorage.setItem(`needApi_${api_name}`, JSON.stringify({ time: now }))
}

使用

  • getNeedApi先判断是否过期,调用后添加一次postNeedApi
js 复制代码
  post_user_sync() {
            if (!this.getNeedApi('post_user_sync', this.routeName)) return
            let { email, password } = this.userdata
            if (!email || !password) return

            let params = {
                email,
                password,
                sync: 'sync',
            }

            if (
                !this.isDev() &&
                window.performance &&
                this.isObject(window.performance.timing)
            ) {
                let { timing } = window.performance
                let arr = [
                    {
                        label: '脚本加载时间',
                        value: timing.domComplete - timing.domInteractive,
                    },
                    {
                        label: '白屏时间',
                        value: timing.domLoading - timing.fetchStart,
                    },
                    {
                        label: '页面完全加载时间',
                        value: timing.loadEventStart - timing.navigationStart,
                    },
                ]

                // 网络情况
                let netInfo = {}
                if (this.isObject(navigator.connection)) {
                    let { downlink, effectiveType, rtt } = navigator.connection
                    netInfo = {
                        downlink,
                        effectiveType,
                        rtt,
                    }
                }

                let data = {
                    load_time: arr,
                    netInfo,
                }
                params = {
                    ...params,
                    ...data,
                }
            }

            httpApi.post_user_sync(params).then((res) => {
                this.postNeedApi('post_user_sync')
                this.setUserData({
                    user: res.data.data,
                })
            }).catch((e) => {
                console.log('同步用户信息失败', e)
            })
        },
相关推荐
拖孩2 小时前
AI 帮我写的小程序「厨菜记」上线满月了,挣了两百块!!!
前端·后端·微信小程序
用户360055579002 小时前
Kestrel_VLLM - 13 · 为什么排除 MoE FFN Tiling 与 Tensor Core
前端
流烟默2 小时前
SSE 实战:在 SpringBoot + Vue 项目中零依赖实现轻量级实时消息推送
vue.js·spring boot·后端·sse
Hilaku3 小时前
AI 流式输出都用 SSE,什么时候必须换 WebSocket?
前端·javascript·程序员
奇牙coding3 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!3 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
程序员老赵3 小时前
Docker 部署 Filestash:轻松搭建浏览器文件管理平台
前端·docker·开源
夏天要喝冰可乐3 小时前
给 23 万字修仙小说造个阅读站:浏览器内打包 EPUB 分页阅读 + 三主题实战
前端·产品·全栈
茶底世界之下3 小时前
林间步道要不要加暗角?用 Awaking 把强度收在20%
前端·ios·图片资源
执子念的飞鱼3 小时前
纯前端预览 275 种文件格式是怎么做到的
前端·vue.js·react.js