асинхронный вызов двух API-интерфейсов в моей программе redux, где мне нужны данные из первого ответа для вызова второго api

#reactjs #redux #redux-saga

#reactjs #упрощение #redux-saga

Вопрос:

У меня есть этот вариант использования, когда мне нужно выполнить два вызова api внутри программы redux. Мне нужен ответ из первого api и я использую его во втором вызове api.В конце мне нужно получить ответ на второй вызов api и заполнить данные моего редуктора. Вот как я поступил в случае одного вызова api и отправил ответ моим редукторам.Я обеспокоен тем, как все должно происходить в случае двух вызовов api, потому что мой второй вызов api зависит от данных из первого вызова api. Я обеспокоен тем, как связать вещи в try catch.

    export function* fetchSportsFanDetailsHandler() {
      try {
       const { authToken, sportsFanId } = yield select(state => ({
        authToken: state.auth.authToken,
        sportsFanId: state.auth.userId
      }));
const sportsFanDetails = yield call(
  fetchSportsFanDetails,
  sportsFanId,
  authToken
);

    const { name, id, mobile, photo, communicationEmail } =  sportsFanDetails;
    yield put({
  type: FETCH_SPORTS_FAN_DETAILS_SUCCESS,
  response: sportsFanDetails
   });
    } catch (err) {
    const { error } = err.response.data;
     yield put({
     type: FETCH_SPORTS_FAN_DETAILS_ERROR,
      error: error.message
      });
    }
}
  

Ответ №1:

Я бы разделил его на две функции: первая с первым вызовом с его собственной попыткой / уловом и собственным действием ошибки и возвращает данные запроса.

Затем я бы проверил эти данные и, если они не пустые, снова вызвал второй запрос с его собственной попыткой / перехватом и обработкой ошибок.

Ответ №2:

я думаю, вам следует создать отдельный метод для второго запроса api, а затем использовать его в отдельном эффекте вызова, после того как вы используете эффект put для первого запроса api, затем используйте эффект второго вызова с результатом первого ответа api, который вам нужен.

например:

 ```
const result = yield call(someMethod, params)
yield put({type: ACTION, result})
const response = yield call(anotherMethod, result)
yield put({type: ACTION_SECOND, response})
```