68 lines
1.4 KiB
JavaScript
68 lines
1.4 KiB
JavaScript
const cache = new Map()
|
|
const CACHE_TTL = 30000
|
|
const PENDING = new Map()
|
|
|
|
export const cachedRequest = async (key, requestFn, ttl = CACHE_TTL) => {
|
|
const now = Date.now()
|
|
const cached = cache.get(key)
|
|
if (cached && now - cached.time < ttl) {
|
|
return cached.data
|
|
}
|
|
|
|
if (PENDING.has(key)) {
|
|
return PENDING.get(key)
|
|
}
|
|
|
|
const promise = requestFn().then(data => {
|
|
cache.set(key, { data, time: Date.now() })
|
|
PENDING.delete(key)
|
|
return data
|
|
}).catch(err => {
|
|
PENDING.delete(key)
|
|
throw err
|
|
})
|
|
|
|
PENDING.set(key, promise)
|
|
return promise
|
|
}
|
|
|
|
export const clearCache = (key) => {
|
|
if (key) {
|
|
cache.delete(key)
|
|
} else {
|
|
cache.clear()
|
|
}
|
|
}
|
|
|
|
export const getCacheKey = (prefix, params) => {
|
|
return `${prefix}:${JSON.stringify(params || {})}`
|
|
}
|
|
|
|
export const createCachedRequest = (cachePrefix) => {
|
|
return async (url, config = {}) => {
|
|
const key = getCacheKey(cachePrefix || url, config.data)
|
|
return cachedRequest(key, () => {
|
|
if (typeof config.request === 'function') {
|
|
return config.request(url, config)
|
|
}
|
|
return new Promise((resolve, reject) => {
|
|
uni.request({
|
|
url: url,
|
|
method: config.method || 'POST',
|
|
data: config.data || {},
|
|
header: config.header || {},
|
|
timeout: config.timeout || 15000,
|
|
success: (res) => resolve(res.data),
|
|
fail: (err) => reject(new Error(err.errMsg || '请求失败'))
|
|
})
|
|
})
|
|
}, config.cacheTTL)
|
|
}
|
|
}
|
|
|
|
export default {
|
|
cachedRequest,
|
|
clearCache,
|
|
createCachedRequest
|
|
}
|