как условно вызвать api в зависимости от полученного значения

#javascript #reactjs #if-statement #asynchronous #axios

#язык JavaScript #реагирует на #если-заявление #асинхронный #аксиос

Вопрос:

мне нужно вызвать api в зависимости от значения, которое я получаю в состоянии,

 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"gt;lt;/scriptgt; lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"gt;lt;/scriptgt; const [selectedValue, setSelectedValue] = useState([])  const firstAPI = async (val) =gt; {  return await axios  .get(`http://localhost:3000/api/v1/rendition?name=${val}amp;amp;excel=true`)  .then(res =gt; console.log('excel', res))  }   const secondAPI = async (val) =gt; {  const limit = pageSize * (page - 1);  return await axios  .get(`http://localhost:3000/api/v1/rendition?id=${val}amp;amp;skip=${limit}amp;amp;take=${pageSize}amp;amp;excel=true`)  .then((res) =gt; {  console.log('excelID', res);  })  }   const handleExcelClick = (param) =gt; {    if(param.filter(item =gt; typeof item === 'string')){  firstAPI(param)  } else {  secondAPI(param)  }  }    lt;Button onClick={() =gt; handleExcelClick(selectedValue)} gt; Excel lt;/Buttongt;  

итак, я получаю значение из 2 разных входных данных, которые хранятся в состоянии SelectedValue, которое может быть строкой или числом, поэтому мне нужно вызвать api в зависимости от значения, если это строка, вызовите firstAPI, если это число, вызовите secondAPI. Но какое бы условие я ни поставил, оно игнорирует оператор if и просто вызывает первый api, который также вызывает ошибку 500, потому что один из api принимает только числа в качестве параметров, я не знаю другого способа подойти к этому, любая помощь будет очень признательна

Комментарии:

1. Зависит от источника данных выбранного значения причины, но кажется, что все данные из входных данных являются строкой. Может быть, вам нужно проверить не typeof, а если строка содержит число?

2. вы правы, если массив содержит строку или число в виде строки, как бы вы проверили, является ли параметр строковым номером, прежде чем он попадет в операторы if? я также пробовал разные способы проверить номер, но не смог заставить его работать

3. у кого-нибудь есть какие-нибудь идеи? я новичок и был бы признателен за любое предложение

Ответ №1:

Попробуйте с:

 ... if(param.filter(item =gt; isNaN(item) )){  firstAPI(param) } else {  secondAPI(param) } ... 

Комментарии:

1. Но обратите внимание, что «param.filter(item =gt; isNaN(item) )» возвращает новый массив! Может быть, вам нужно проверить длину нового массива, чтобы узнать, что у вас есть хотя бы один строковый параметр в param? Действительно ли массив SelectedValue-массив?

2. спасибо, что нашли время помочь Олегу!

Ответ №2:

Итак, я решил это много дней назад, но забыл опубликовать свое решение, так что вот оно:

 const handleExcelClick = (param: any) =gt; { if (typeof param === 'number') {  return firstAPI(param); } else if (param.some((i: any) =gt; typeof i === 'string')) {  return secondAPI(param); }  

};

я в основном забыл добавить возврат к каждому оператору, и также не было смысла фильтровать значения, основываясь только на методе фильтра, поэтому я использовал метод массива «некоторые», чтобы просто получать значения, возвращающие значение true, если выполняется условие, которое проверяет, соответствует ли тип данных оператору

надеюсь, это поможет всем, кто пытается сделать то же самое