让我们说我必须连续对api进行4次调用。调用成功结束并返回响应后,我将该调用的结果存储在“缓存”数组中。在进行每次提取之前,我想通过检查缓存中的URL来检查该URL是否先前已经被提取过。如果缓存中存在该URL,我只是console.log结果,否则将调用api。
目前,我有类似以下代码的内容:
const requests = [url1, url2, url3, url2]
const cache = []
function getData(url) {
return fetch(url)
.then(function(response) {
return response.json()
})
}
function checkCache(url) {
return cache.filter(function (item) {
return item.url === url
})
}
function callApi(url) {
const cacheData = checkCache(url)
console.log(cacheData)
if (cacheData.length > 0) {
console.log (cacheData)
}
else {
getData(url).then(function (data) {
console.log(data)
cache.push(data)
})
}
}
requests.forEach(function(url) {
callApi(url)
})
问题在于,即使在提取完成之前,就对这4个url的检查条件进行了评估,因此缓存为空,输出如下所示:
[] //checks the cache 4 times and its empty x 4
[]
[]
[]
data //calls the api
data //calls the api
data //calls the api
data //calls the api, but this data should come from the cache since the url2 have been already called
我该如何处理?
答案 0 :(得分:1)
将promise本身存储在缓存中(您可以在发出请求时立即执行此操作),不仅将结果保存到缓存中,还可以:
const cache = new Map();
function callApi(url) {
if (!cache.has(url))
cache.set(url, getData(url));
return cache.get(url);
}