Проверка условия перед вызовом - PullRequest
0 голосов
/ 25 ноября 2018

Допустим, я должен последовательно выполнить 4 вызова API.Когда вызов успешно заканчивается и возвращает ответ, я сохраняю результат этого вызова в массиве «кеш».Перед выполнением каждой выборки я хочу проверить, был ли ранее выбран 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 голосов
/ 25 ноября 2018

Сохраните само обещание в кеше (что вы можете сделать сразу при отправке запроса), а не только результат, как только он поступил:

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