Как я могу вернуть обещание в вызове диспетчеризации с избыточным действием, чтобы я мог связать блоки .then? - PullRequest
0 голосов
/ 09 февраля 2019

Я создаю приложение с использованиемact-native и redux.Мое приложение должно отправить запрос в API Firebase Rest, чтобы вернуть задачи пользователя.В моем приложении-реактиве я получаю этот ответ через функцию приведения, которая передается в соединительную часть компонентов-реактивов.Я бы хотел связать блок .then сразу после вызова своей функции.

Я попытался создать обещание и вернуть его в своем действии, но оно автоматически переходит в ошибку при объединении в цепочку .then / .catch Iтакже пытался сделать то же самое, не создавая обещание.

Вот мое действие:

export const fetchHomework = () => {
  return (dispatch, getState) => {
      dispatch(uiStartLoading());
      dispatch(uiStartFetchingHomework());
      dispatch(authGetToken())
      .catch(err => {
        dispatch(errHandler(err))
      })
      .then(token => {
        const uid = getState().userid;

        fetch(restAPI)
        .catch(err => {
          dispatch(errHandler(err));
        })
        .then(res => res.json())
        .then(response => {
          dispatch({
            type : 'SET_HOMEWORK_FOR_AGENDA',
            homework : response
          })
          dispatch(uiStopLoading());
          dispatch(uiStopFetchingHomework());
        })
        .catch(err => {
          dispatch(errHandler(err));
          dispatch(uiStopLoading());
          dispatch(uiStopFetchingHomework());
        })

      })
      dispatch(uiStopLoading());
      dispatch(uiStopFetchingHomework());
  }
}

Примечание: остальные API заменяется URL-адрес остальных API И вот где я получитьэти данные:

this.setState({refreshing: true});
this.props.retrieveHomework();
this.setState({refreshing: false, firebaseItems : this.props.homework});
this.loadItems(this.state.selectedDay);

(это вызывается в функции при обновлении)

Я ожидал, что когда я соединяю блок .then после retrieveHomework, блок then будет ждать, пока функциязакончить, а затем запустить код внутри, но это не то, что происходит.Происходит следующее: он либо пропускает блоки then, либо выдает ошибку, которую перехватывает блок catch.

Редактировать: this.props.retrieveHomework - это функция, которая указывает на асинхронное действие, так как я использую избыточный thunk.

1 Ответ

0 голосов
/ 09 февраля 2019

Вам нужно переместить весь код, который вы хотите ждать, чтобы запустить в .then:

this.props.retrieveHomework()
  .then(() => {
    this.setState({refreshing: false, firebaseItems : this.props.homework});
    this.loadItems(this.state.selectedDay); // If this is async, you need to `return` it here as well
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...