@ArtemKalinin2503

Почему два раза вызывается console.log при получение данных из Saga?

- Есть сервер express который получает данные из Yandex API Weather
5ca3cb0b03669307590885.png
- Есть saga которая принимает ответ от сервера с данными:
5ca3ca8bb0129844715433.png

- Есть компонент в котором происходит вызов action который вызывает данную сагу:
5ca3cb61a17f2574666958.png

- Action описаны в . reducer
5ca3cbd9b07cf737659434.png

- Но выходит так что сначала приходит пустой state, а только потом второй раз в state приходят данные, в итоге я не могу работать с данными при загрузке страницы, помогите пожалуйста....
5ca3ca1000a0c733302305.png
  • Вопрос задан
  • 644 просмотра
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
1. Метод componentDidMound вызывается после монтирования компонента. Естественно данных во время первого рендера быть не может.
2. Запрос за данными асинхронный, вы не можете знать в какой момент придет ответ. Поэтому хорошим решением будет хранить и использовать ключ состояния загрузки. У вас он присутствует в коде, но не используется(isGettingCityWeather, в моем примере это isFetching)
3. Ключ состояния загрузки при получении данных и ошибке у вас не обновляется. Исправьте.
4. city приходит в виде объекта, но в начальном состоянии у вас массив. Исправьте.

Пример решения:
const initialState = {
  isFetching: false,
  city: {},
  error: null,
};

const weatherReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'GET_WEATHER_REQUEST':
      return {
        ...state,
        isFetching: true,
        error: null,
      };
    case 'GET_WEATHER_SUCCEEDED':
      return {
        ...state,
        isFetching: false,
        city: action.payload,
      };
    case 'GET_WEATHER_FAILED':
      return {
        ...state,
        isFetching: false,
        error: action.payload,
      };
    default:
      return state;
  }
}


render() {
  const { isFetching, city, error, getWeather } = this.props;
  
  if (isFetching) return <div>Loading...</div>;

  if (error) return <TryAgain error={error} handler={getWeather} />;
  
  return <div>{city.now_dt}</div>;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы