Следующая функция должна сначала выполнить вызов API, если ответ на этот вызов API не удовлетворяет некоторому условию, необходимо снова вызвать тот же API, с немного другим запросом на этот раз (предыдущий год вместо текущего год). Цель функции - отправить действие с определенным значением month
(строка). Вот как будут выглядеть данные ответа:
[
{
"month":2,
"year":2019,
"status":"product is not ready to go yet"
},
{
"month":10,
"year":2019,
"status":"product is not ready to go yet"
},
{
"month":1,
"year":2018,
"status":"product is not ready to go yet"
},
{
"month":5,
"year":2018,
"status":"product is ready to go"
}
]
А вот моя функция:
const months = [{key: '1', value: 'January'}] //and so on
export function getProductStatus(productId) {
const year = moment().format('YYYY');
const previousYear = moment().subtract(1, 'year').format('YYYY');
let targetURL = `www.someAPI.com/api/data/${productId}?year=${year}`;
let targetMonth = '';
return async dispatch => {
try{
let productResponse = await makeRequest(targetURL);
const currentYearWithMonth = productResponse.find(res => res.status.toLowerCase() === 'product is ready to go')
if(currentYearWithMonth) {
targetMonth = months.find(month => month.key === currentYearWithMonth.month.toString())
}
else {
targetURL = `www.someAPI.com/api/data/${productId}?year=${previousYear}`;
productResponse = await makeRequest(targetURL);
const prevYearWithMonth = productResponse.find(res => res.status.toLowerCase() === 'product is ready to go')
if(prevYearWithMonth) {
targetMonth = months.find(month => month.key === prevYearWithMonth.month.toString())
}
}
dispatch({ type: GET_PRODUCT_STATUS, payload: targetMonth ? targetMonth.value : null }) // better way to handle this too?
} catch (error) {
console.log('error => ', error)
}
}
}
Проблема с этой логикой заключается в том, что она выполняет то, что ожидается от функции, поскольку в ней возвращается правильное значение месяца, за исключением того, что логика выглядит очень повторяющейся. С одной стороны, функция должна сначала вызвать API, проверить значения, но с другой стороны, она также должна снова вызвать API, если не получит значения при первом вызове. Какой хороший способ реорганизовать этот кусок кода?