Как вызывать конечные точки веб-службы один за другим? - PullRequest
0 голосов
/ 03 мая 2020

Я хочу реализовать функцию в JavaScript, которая вызывает серию конечных точек веб-службы и проверяет значение в ответе на вызов API. Мне нужно добиться этого таким образом, чтобы сначала вызывалась первая страница конечной точки, а затем был бы метод фильтра для фильтрации указанного объекта c из ответа. Если объект найден, этот процесс должен прерваться, и объект должен быть возвращен. Однако, если объект не найден в первой конечной точке, тогда должна быть вызвана вторая конечная точка, и тот же процесс повторяется до тех пор, пока объект не будет найден.

Конечная точка веб-службы, над которой я работаю:

https://jsonmock.hackerrank.com/api/countries?page=1

Этот API-интерфейс возвращает список данных по стране. Здесь значение запроса страницы варьируется от 1 до 25. Мне нужно вызвать конечную точку и проверить определенную c страну от 1 до 25, пока не будет найден объект страны.

Я пытался добиться этого с помощью JavaScript Promise и Fetch API и не могли придумать, как вызывать API один за другим.

Я действительно жду вашего ответа. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы можете использовать async и await для этого:

async function findCountry(country) {
    for (let page = 1; page < 26; page++) {
        console.log("page = " + page); // for debugging only
        let response = await fetch("https://jsonmock.hackerrank.com/api/countries?page=" + page);
        let {data} = await response.json();
        let obj = data.find(obj => obj.name == country);
        if (obj) return obj;
    }
}

let country = "Belgium";
findCountry(country).then(obj => {
    if (obj) {
        console.log("The capital of " + country + " is " + obj.capital);
    } else {
        console.log("Could not find " + country);
    } 
});

Если вы знаете, что данные отсортированы по названию страны, вы можете уменьшить среднее количество запросов с помощью двоичного поиска.

0 голосов
/ 03 мая 2020

Вот способ, которым вы можете сделать это.

const url = 'https://jsonmock.hackerrank.com/api/countries'

const fetchFromApi = async (countryName, page) => {
  const res = await fetch(`${url}?page=${page}`)
  return await res.json()
}

const getCountryFromResults = (countryName, data) => {
  return data.find(item => item.name.toLowerCase() === countryName.toLowerCase())
}

const findCountry = async (countryName) => {
  let page = 1;
  let totalPages = 1;

  while(page <= totalPages) {
    const res = await fetchFromApi(countryName, page);
    if(totalPages < res.total_pages) {
      totalPages = res.total_pages
    }
    const country = getCountryFromResults(countryName, res.data)
    if(country){
      return country
    }
    page = page + 1
  }
  
}

( async () => {
  console.log(await findCountry("Afghanistan"))

  console.log(await findCountry("Argentina"))
}
)()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...