首页 > 其他分享 >使用indexDB对接口请求进行简单的缓存数据处理

使用indexDB对接口请求进行简单的缓存数据处理

时间:2023-02-15 11:24:00浏览次数:69  
标签:storeName res 对接口 request param any db 缓存数据 indexDB

export function _getAction (url: string, param?: any, header?: any){
    return new Promise((resovle: any, error: any)=>{
        indexDBMap.getDataByKey(JSON.stringify({url, param, header})).then((res: any)=>{
            resovle(res);
        }).catch(()=>{
            getAction(url, param, header).then((res: any)=>{
                indexDBMap.addData(JSON.stringify({url, param, header}), JSON.stringify(res));
                resovle(res);
            });
        })
    });
    
    // return getAction(url, param, header).then((res: any)=>{
    //     indexDBMap.addData(JSON.stringify({url, param}), JSON.stringify(res));
    //     return res;
    // });
} 

export function _postAction (url: string, param?: any, header?: any){
    return new Promise((resovle: any, error: any)=>{
        indexDBMap.getDataByKey(JSON.stringify({url, param, header})).then((res: any)=>{
            resovle(res);
        }).catch(()=>{
            postAction(url, param, header).then((res: any)=>{
                indexDBMap.addData(JSON.stringify({url, param, header}), JSON.stringify(res));
                resovle(res);
            });
        })
    });
}

// 开启缓存工具
class IndexDBMap {

    public databaseName = "arcgisMapIndexDB-chenxian";

    public storeName = "cacheData";

    public version = 1;

    public indexDB: any;

    constructor (){

        this.databaseName = "arcgisMapIndexDB-chenxian";
        this.version = 1;
        this.getIndexDB();

    }

    public getIndexDB (){
        var request = window.indexedDB.open(this.databaseName, this.version);
        request.onerror = function(event) {
            // console.log('缓存系统打开报错');
        }
        var db;
        request.onsuccess = (event)=> {
            db = request.result;
            // console.log('缓存系统打开成功');
            this.indexDB = db;
        }
        request.onupgradeneeded = (event: any)=> {
            db = event.target.result;
            // console.log("缓存系统更新成功");
            this.indexDB = db;

            // 数据库创建或升级的时候会触发
            let objectStore
            if (!db.objectStoreNames.contains(this.storeName)) {
                objectStore = db.createObjectStore(this.storeName, { keyPath: 'id' }) // 创建表
            // objectStore.createIndex('name', 'name', { unique: true }) // 创建索引 可以让你搜索任意字段
            }
        }
    }

    // 添加数据
    public addData (id: string, data: string, db: any = this.indexDB, storeName: string = this.storeName) {
        let request = db.transaction([storeName], 'readwrite') // 事务对象 指定表格名称和操作模式("只读"或"读写")
        .objectStore(storeName) // 仓库对象
        .add({ id, data })
    
        request.onsuccess = function() {
            // console.log('数据缓存成功', id);
        }
    
        request.onerror = function(event: any) {
            console.log('数据缓存失败', event.target.error)
            // throw new Error(event.target.error)
        }
    }

    getDataByKey(key: string, db: any = this.indexDB, storeName: string = this.storeName) {
        return new Promise((resovle: any, error: any)=>{
            let transaction = db.transaction([storeName]) // 事务
            let objectStore = transaction.objectStore(storeName) // 仓库对象
            let request = objectStore.get(key)
    
            request.onerror = function() {
                // console.log('查询失败')
                error();
            }
    
            request.onsuccess = function() {
                // console.log('缓存查询结果: ', request.result)
                if ( request.result )  {
                    resovle(JSON.parse(request.result.data));
                } else {
                    error();
                }
            }
        })
    }
}

const indexDBMap = window.indexDBMap = new IndexDBMap()

 

标签:storeName,res,对接口,request,param,any,db,缓存数据,indexDB
From: https://www.cnblogs.com/liao1992/p/17122096.html

相关文章

  • 数据库缓存数据一致性保证
    一、背景在本文正式开始之前,需要先取得以下两点的共识:a)缓存必须要有过期时间b)保证数据库跟缓存的最终一致性即可,不必追求强一致性。数据一致性指的是:a)缓存中存......
  • 开发&运维如何对接口响应时间慢问题,快速定界排查?
    01问题背景自建机房,生产环境上某接口耗时超过2s,接口实现逻辑包含:数据库读写下游api调用数据统计开发本地自测,接口耗时却只有106ms。于是开发问运维:“生产环境的网络确定没......
  • 从实战出发,聊聊缓存数据库一致性
    在云服务中,缓存是极其重要的一点。所谓缓存,其实是一个高速数据存储层。当缓存存在后,日后再次请求该数据就会直接访问缓存,提升数据访问的速度。但是缓存存储的数据通常是短......
  • 使用 Pivotal GemFire 缓存数据
    本指南将介绍使用ApacheGeode的数据管理系统,用于缓存来自应用程序代码的某些调用。有关ApacheGeode概念和从ApacheGeode访问数据的更多一般知识,请通读本指南,使用Apa......
  • #yyds干货盘点#前端存储之indexDB
    ​​localStorage​​​是前端本地存储的一种,其容量一般在​​5M-10M​​左右,用来缓存一些简单的数据基本够用,毕竟定位也不是大数据量的存储。在某些场景下​​localSto......
  • 使用Spring Security对接口实现访问权限
     1<!--加入security依赖-->2<dependency>3<groupId>org.springframework.boot</groupId>4<artifactId>spring-boot-......
  • Vue切换页面保存缓存数据或文件的两种方式
    功能描述:   在一个大的父组件中,根据tab页面的v-if进行切面的切换,但是v-if的切换会造成组件的销毁,再切换回去输入的数据或者上传的文件就没有了,所以切换页面不能让tab......
  • 对外提供API,通过appId、appSecret、sign秘钥对接口做鉴权
    一、背景在接口开发过程中,我们通常不能暴露一个接口给第三方随便调用,要对第三方发来参数进行校验,看是不是具有访问权限。名词介绍:1、appId:应用id,用户自定义命名,如:*-ac......
  • 面试官:如果保证数据库和缓存数据的一致性?面试必问……
    作者:牛牛码特链接:https://juejin.cn/post/6844903929281511438背景缓存是软件开发中一个非常有用的概念,数据库缓存更是在项目中必然会遇到的场景。而缓存一致性的保证,更......
  • Redis 缓存数据库一致性手撕面答
    引言自Redis入门篇过后,已经好久没更Redis了,接下来应该从实战篇,原理篇,面试篇几个层次来展开,本篇主要是实战篇中的数据库缓存一致性问题,以问题形式展开,应对面试场景作答【melo......