[Design Pattern] Encapsulate a network request lib - 2. Cache the request
Usage of a cached request:
const req = createCacheRequestor();
req.get('/a') // request
req.get('/a') // use cache
req.get('/b') // request
req.get('/b') // use cache
What we need to do is resolve following questions:
- how to cache the request
- where the save the cache
- what is the cache key
Cache key
Example code:
const req = createCacheRequestor({
key: (config) {
return config.pathname // use pathname as a key
},
presist: true
})
Design
Due to there are many ways to provide presistent feature, different approach may have different params / foramt / apis; therefore we need a stable interface for user to use.
export interface CacheStore {
has(key: string): Promise<boolean>;
set<T>(key: string, ...values: T[]): Promise<void>;
get<T>()key: string): Promise<T>
// other methods
}
export function useCacheStore(isPresist): CacheStore {
if(!isPersist) {
return createMemoryStore();
} else {
return createStorageStore();
}
}
Cache duration
Usage:
const req = crateCacheRequestor({
duration: 1000 * 60 * 60,
isValild(key, config) {
// return true means cache is valid, return false then cache is invalid
}
})
Example code:
function createCacheRequestor(cacheOptions) {
const options = normalizeOptions(cacheOptions);
const store = useCacheStore(options.persist)
const req = useRequestor()
return req;
}
req.on('beforeRequest', async (config) => {
const key = options.key(config);
const hasKey = await store.has(key);
if (hasKey && options.isValid(key, config)) {
// return cache reuslt
}
})
req.on('responseBody', (config, resp) => {
const key = options.key(config)
store.set(key, resp.toPlain());
})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-12-01 [Typescript] 123. Hard - Intersection
2021-12-01 [AWS] Assign a public IP address to an EC2 instance after launched
2020-12-01 [Java Spring] Implementing Spring Security
2019-12-01 [Javascript] Sort by multi factors
2019-12-01 [Javascript] Keyword 'in' to check prop exists on Object
2015-12-01 [Javascript] Advanced Reduce: Common Mistakes