React redux hook useDispatch function, как я могу вызвать что-то после его завершения

В коде, который я использовал в примере, у меня есть форма свойства для добавления нового свойства, после сохранения его в базе данных я хочу обновить хранилище redux с новым свойством и отправить пользователя на страницу свойств, где перечислены все свойства. но я хочу сделать это после отправки (addProperty(savedProperty)), тогда я могу сделать history.push("/properties"). Как мне там дождаться окончания отправки? Я использую useDispatch из react-redux.

 async function handlePropertyFormSubmit(values) {
    const savedProperty = await savePropertyGraphQlPromise(values);
    if (savedProperty) {
      dispatch(reset("property"));//reset property form
      dispatch(addProperty(savedProperty));
      //here I want to wait the dispatch finish and then send user to the properties page.
      history.push("/properties");
    }
  }

3 ответа

Похоже, вы используете async/await, поэтому вы также можете использовать его для ожидания отправки.

 async function handlePropertyFormSubmit(values) {
    const savedProperty = await savePropertyGraphQlPromise(values);
    if (savedProperty) {
      await dispatch(reset("property"));//reset property form
      await dispatch(addProperty(savedProperty));

      history.push("/properties");
    }
  }

Если addProperty действие возвращает обещание (например, преобразователь), вы можете использовать then метод тоже.

dispatch(addProperty(savedProperty)).then(() => {
 history.push('/properties')
})

Вы можете создать "сигнал" своей рассылкой - например, dispatched: false и установите значение true, когда закончите dispatch(затем отключите его после перенаправления, если вы собираетесь использовать это свойство в других компонентах). Если вы используете реактивный маршрутизатор, вы можете вместо этого визуализировать<Redirect to="yourNewURL" /> для перенаправления (отображать условно на основе redux store state).

Оберните вашу вторую отправку с помощью setTimeout, что-то вроде этого firstDispatch() setTimeout(secondDispatch)

Другие вопросы по тегам