Выполнять запросы axios последовательно;если не удалось, попробуйте следующий URL в массиве, если успешный выход - PullRequest
0 голосов
/ 20 октября 2019

Я использую несколько API для получения новостей и статей, связанных с JavaScript. Если первый запрос API не удался, я хочу перейти к следующему и так далее. Если один запрос успешен, я хочу остановить все запросы.

const apis = [
  'http://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow',
  'https://newsapi.org/v2/everything?language=en&q=javascript&from=' + formatDate(new Date()) + '&sortBy=publishedAt&apiKey=key',
  ...
]

Я пришел с этим, он работает, но это ужасно:

axios.get('http://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow')
            .then(
                response => {
                    console.log(response.data);
                    const titles = response.data.items.map(t=>{ return { title: t.title, link: t.link }});
                    setHive(()=>createHiveBackground(titles));
                    setLoader(false);
                }
            ).catch((e)=>{
              console.log(e);
              axios.get('https://newsapi.org/v2/everything?language=en&q=javascript&from=' + formatDate(new Date()) + '&sortBy=publishedAt&apiKey=key')
              .then(
                response => {
                    console.log(response.data);
                    const titles = response.data.articles.map(t=>{ return { title: t.title, link: t.url }});
                    console.log(titles);
                    setHive(()=>createHiveBackground(titles));
                    setLoader(false);
                }
              ).catch((e)=>{
                setLoader(false);
                console.log(e);
              });

Также, если у меня много URLиспользовать это было бы болью. Что было бы лучшим способом справиться с этим?

1 Ответ

1 голос
/ 20 октября 2019

Вы можете использовать рекурсию, вот пример:

const apis = [
  'http://api.stackexchange.com/2.2/questions?order=desc&sort=activity&site=stackoverflow',
  'https://newsapi.org/v2/everything?language=en&q=javascript&from=' + formatDate(new Date()) + '&sortBy=publishedAt&apiKey=key',
  ...
]
function getFirstValid(arr, index) {
  return axios
    .get(arr[index])
    .catch((e) => {
      if (index < arr.length - 1) {
        return getFirstValid(arr, index + 1);
      }
      throw e;
    });
}

getFirstValid(apis, 0)
  .then(response => console.log(response))
  .catch(e => console.error('none are valid', e))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...