Условные вызовы API на основе ответа - Рефакторинг для удобства обслуживания - PullRequest
0 голосов
/ 02 апреля 2019

Следующая функция должна сначала выполнить вызов 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, если не получит значения при первом вызове. Какой хороший способ реорганизовать этот кусок кода?

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