Javascript 按顺序执行axios请求;如果失败,请尝试阵列中的下一个url,如果成功,请退出

Javascript 按顺序执行axios请求;如果失败,请尝试阵列中的下一个url,如果成功,请退出,javascript,ajax,axios,Javascript,Ajax,Axios,我正在使用一些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=ja

我正在使用一些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);
              });

此外,如果我有许多网址使用它将是一个痛苦。处理此问题的更好方法是什么?

您可以使用递归,下面是一个示例:

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))