promise实现前端缓存

作者: nick121212 | 来源:发表于2019-12-12 17:27 被阅读0次

promise实现前端缓存

举个常见的场景:在调用接口前都需要做一个权限check,伪代码如下。

    function getDataFromServer(url, options){
        return checkFromServer().then(()=>{
            return axios(url,options);
        });
    }
    
    function checkFromServer(){
        return axios("/check").then((res)=>{
            if(res.data.code===403){
                throw new Error("permission deny!");
            }
        });
    }

    // 调用接口数据
    getDataFromServer("/data",{});

上面的代码看起来没有什么问题。如果考虑并发状态下呢?


getDataFromServer("/data",{});
getDataFromServer("/data1",{});
getDataFromServer("/data3",{});

在这里会触发三次的/check请求,从实际情况出发的话,在短期内可能只需要一次/check就可以了,性能上也能保障最优。

改造一下上面的代码:


    const checkPromise = null;
    
    function getDataFromServer(url, options){
        return checkFromServer().then(()=>{
            return axios(url,options);
        });
    }
    
    function checkFromServer(){
        // 如果有缓存,则直接使用缓存
        if(checkPromise){
            return checkPromise;
        }
        
        checkPromise = axios("/check").then((res)=>{
            if(res.data.code===403){
                throw new Error("permission deny!");
            }
            
            // 5秒后清除缓存
            setTimeout(()=>{
                checkPromise = null;
            },5000);
            
        }).catch((err)=>{
            checkPromise = null;
            
            throw err;
        });
        
        return checkPromise;
    }

    // 调用接口数据
    getDataFromServer("/data",{});
    getDataFromServer("/data1",{});
    getDataFromServer("/data3",{});

如上代码,既解决了/check被调用多次的问题,也解决了并发时候的问题。看起来好像没什么问题了。

再来考虑一个场景把,假设/check数据需要缓存5分钟,5分钟之内都不会再去请求接口并考虑刷新页面的情况呢。

那就比较复杂了,数据可能需要落地到localstorage,可能还需要考虑缓存淘汰机制等情况。

这里有现成写好的库cache-in-stroage

快速应用:

import { cacheDec } from "cache-in-storage";

const getTimeSpan = async (isError = false) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (isError) {
        return reject(new Error("test"));
      }
      resolve(Date.now());
    }, 200);
  });
};

// 对getTimeSpan进行缓存,并把缓存结果放入localStorage
const getTimeSpanWithCache = cacheDec(getTimeSpan, "keyInCache", { cache:true }, localStorage);

// 此时执行方法返回的值都是相同的
getTimeSpanWithCache().then(console.log);
getTimeSpanWithCache().then(console.log);
getTimeSpanWithCache(true).catch(console.error);

相关文章

  • 前端周刊:2022-2期

    前端周刊:2022-2期 前端开发 利用 Promise 的 cache 特性实现前端缓存[https://zhu...

  • promise实现前端缓存

    promise实现前端缓存 举个常见的场景:在调用接口前都需要做一个权限check,伪代码如下。 上面的代码看起来...

  • 前端杂谈: 如何实现一个 Promise?

    前端杂谈: 如何实现一个 Promise? 首先, 什么是 Promise? A promise is an ob...

  • 【面试题解析】手动实现Promise

    前端面试的时候,经常能看到这样一道题,实现一个Promise。 这篇文章将一步步实现 Promise,彻底弄懂 P...

  • 一步步手写Promsie源码(二)

    Promise.all方法实现 Promise.resolve方法实现 Promise.finally方法实现 c...

  • 手动实现一个promise

    整体流程 先定义整体结构实现Promise构造函数实现promise.then实现promise.catch实现p...

  • 常见问题

    如果让你实现一个promise怎么样实现前端性能理解,优化有哪些移动端适配方案express中间件如何实现了解TC...

  • 前端缓存

    前端缓存 提示这里讲的前端缓存是指前端对接口数据的缓存处理,而不是通过 HTTP(s)缓存 前言 通常会在项目中有...

  • 前端缓存

    前端缓存 前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务...

  • 一文读懂http缓存(超详细)

    前端缓存 前端缓存可分为两大类:http缓存和浏览器缓存。我们今天重点讲的是http缓存,所以关于浏览器缓存大家自...

网友评论

    本文标题:promise实现前端缓存

    本文链接:https://www.haomeiwen.com/subject/brqagctx.html