在进行提取调用之前检查条件

时间:2018-11-24 21:03:11

标签: javascript ecmascript-6 es6-promise

让我们说我必须连续对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

我该如何处理?

1 个答案:

答案 0 :(得分:1)

将promise本身存储在缓存中(您可以在发出请求时立即执行此操作),不仅将结果保存到缓存中,还可以:

const cache = new Map();
function callApi(url) {
  if (!cache.has(url))
    cache.set(url, getData(url));
  return cache.get(url);
}