优化性能与减少网络流量:前端api请求缓存

8,787次阅读
没有评论

共计 3481 个字符,预计需要花费 9 分钟才能阅读完成。

梦梦贝莉雅
2023-12-04 10:18:00
浏览数 (1657)

在开发 web 应用程序时,性能是一个重要的话题。为了提高用户体验和节省网络资源,我们需要对一些频繁或重复的 API 请求进行缓存,以减少不必要的服务器交互。缓存的原理是将第一次请求的数据保存在客户端,之后再次请求时直接从缓存中获取,而不是向服务器发送请求。

缓存的方式有很多种,根据不同的业务场景和需求,我们可以选择合适的方案来实现缓存功能。本文将介绍前端 API 请求缓存的三种方案,从简单到复杂,分别是:

一、数据缓存

  • 数据缓存是最简单的一种缓存方案,它的思路是将第一次请求的数据保存在一个 Map 对象中,以 API 的名称或参数作为键,以数据作为值。之后再次请求时,先从 Map 对象中查找是否有对应的数据,如果有则直接返回,如果没有则向服务器发送请求,并将返回的数据保存在 Map 对象中。
  • 数据缓存的优点是实现简单,适用于一些不需要更新的静态数据。缺点是无法处理同时多次请求的情况,也无法设置缓存的有效期,可能会导致数据过时或冗余。

示例代码如下:


const dataCache = new Map();


async function getWares() {
    
    let key = "wares";
    
    let data = dataCache.getkey;
    if (!data) {const res = await request.get("/getWares");
        
        data = res.data;
        
        dataCache.set(key, data);
    }
    
    return data;
}

调用方式如下:


getWares().then((data) => {console.log(data);
});

getWares().then((data) => {console.log(data);
});

二、Promise 缓存

  • Promise 缓存是对数据缓存的改进,它的思路是将第一次请求的 Promise 对象保存在一个 Map 对象中,以 API 的名称或参数作为键,以 Promise 对象作为值。之后再次请求时,先从 Map 对象中查找是否有对应的 Promise 对象,如果有则直接返回,如果没有则向服务器发送请求,并将返回的 Promise 对象保存在 Map 对象中。
  • Promise 缓存的优点是可以处理同时多次请求的情况,避免重复发送请求,只有第一次请求会向服务器发送请求,之后的请求都会等待第一次请求的结果。缺点是无法设置缓存的有效期,可能会导致数据过时或冗余。

示例代码如下:


const promiseCache = new Map();


function getWares() {
    
    let key = "wares";
    
    let promise = promiseCache.getkey;
    
    if (!promise) {promise = request.get("/getWares").then((res) => {return res.data;
        }).catch((error) => {
            
            promiseCache.deletekey;
            
            return Promise.reject(error);
        });
        
        promiseCache.set(key, promise);
    }
    
    return promise;
}

调用方式如下:


getWares().then((data) => {console.log(data);
});

getWares().then((data) => {console.log(data);
});

三、多 Promise 缓存

  • 多 Promise 缓存是对 Promise 缓存的扩展,它的思路是将多个 API 请求的 Promise 对象保存在一个 Map 对象中,以 API 的名称或参数作为键,以 Promise 对象作为值。之后再次请求时,先从 Map 对象中查找是否有对应的 Promise 对象,如果有则直接返回,如果没有则向服务器发送请求,并将返回的 Promise 对象保存在 Map 对象中。最后,使用 Promise.all 方法将多个 Promise 对象合并为一个 Promise 对象,统一返回结果。
  • 多 Promise 缓存的优点是可以同时获取多个 API 请求的数据,提高效率,只有第一次请求会向服务器发送请求,之后的请求都会等待第一次请求的结果。缺点是无法设置缓存的有效期,可能会导致数据过时或冗余。另外,如果其中一个 API 请求出错,会导致整个 Promise 对象被拒绝,无法获取其他 API 请求的数据。

示例代码如下:


const querys = {wares: "/getWares",
    skus: "/getSku",
};


const promiseCache = new Map();


async function queryAll(queryApiName) {
    
    const queryIsArray = Array.isArray(queryApiName);
    
    const apis = queryIsArray ? queryApiName : [queryApiName];
    
    const promiseApi = [];
    
    apis.forEach((api) => {let promise = promiseCache.get(api);
        
        if (!promise) {promise = request.get(querys[api]).then((res) => {return res.data;
            }).catch((error) => {promiseCache.delete(api);
                
                return Promise.reject(error);
            });
            
            promiseCache.set(api, promise);
        }
        
        promiseApi.push(promise);
    });
    
    return Promise.all(promiseApi).then((res) => {return queryIsArray ? res : res[0];
    });
}

调用方式如下:


queryAll("wares").then((data) => {console.log(data);
});

queryAll(["wares", "skus"]).then((data) => {console.log(data);
});

总结

通过实施 API 请求缓存,我们可以显著提高前端应用程序的性能和用户体验。选择合适的缓存方案取决于应用程序的需求和特点。在实际开发中,我们可以根据数据的变化频率、数据的重要性、存储空间的限制等因素来选择适当的方案。结合合适的缓存方案,我们可以有效地减少网络请求,提高应用程序的响应速度,并降低服务器负载。同时,需要注意缓存的更新策略,以确保数据的准确性和实时性。

1698630578111788

如果你对前端工程师职业和编程技术感兴趣,不妨访问编程狮官网(https://www.w3cschool.cn/)。编程狮官网提供了大量的技术文章、编程教程和资源,涵盖了前端工程师、编程、职业规划等多个领域的知识。无论你是初学者还是有经验的开发者,编程狮官网都为你提供了有用的信息和资源,助你在编程领域取得成功。不要错过这个宝贵的学习机会!

原文地址: 优化性能与减少网络流量:前端 api 请求缓存

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-19发表,共计3481字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)