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)
            })
        },
相关推荐
愚公搬代码16 小时前
【愚公系列】《Web应用安全》006-HackBar插件的使用
前端·安全
超爱吃香菜的菜鸟16 小时前
关于pnpm 部分使用(一)
前端·vue.js
Vuji16 小时前
Pi 插件解剖|git-checkpoint.ts:只用 53 行,让 fork 恢复代码状态
前端·agent
大家的林语冰16 小时前
✌️ 让 Rust 再次伟大,pnpm 12 抛弃 TypeScript,移植 Rust 原地起飞!
前端·javascript·node.js
XPoet17 小时前
AI 编程工程化:实战——从 0 到 1 搭建 AI 编程工作流
前端·后端·ai编程
-今昭-18 小时前
Logstash 管理
java·服务器·前端
名字还没想好☜18 小时前
React 用自定义 useDebounce Hook 治好搜索框频繁请求:防抖、竞态取消与卸载清理
前端·javascript·react.js·react·hooks
杉氧18 小时前
Flutter 跨平台多端适配与 Android/iOS 一键自动化打包发布
android·前端·flutter
障碍的枫子18 小时前
xss和CSRF的攻击和防御
前端·xss·csrf
用户9210802628618 小时前
3. 给 Bubble 新增一个 Agent Variant
前端