Когда Redux разрешает отправку, если создатель моего действия возвращает обещание? - PullRequest
0 голосов
/ 07 ноября 2019

В этом посте Дэн пишет фрагмент для демонстрации асинхронного действия.

Мне интересно, как Redux узнает, что мой store полностью обновлен?

Есть ли вероятность, что fetchedUser еще не обновился во время выполнения dispatch(getUser(userId)).then?

Что произойдет, если я напишу setTimeout(()=>{ dispatch({ type: 'GET_USER_SUCCESS', id, response }) }, 5000) в fetchUser.then?

export function getUser(id) {
  return dispatch => {
    dispatch({ type: 'GET_USER_REQUEST', id })

    // Perform the actual API call
    return fetchUser().then(
      response => {
        // Reducers may handle this to show the data and reset isFetching
        dispatch({ type: 'GET_USER_SUCCESS', id,  response })
      },
      error => { ... }
    )
  }
}



export function getUserAndTheirFirstPost(userId) {
  return (dispatch, getState) => {
    return dispatch(getUser(userId)).then(() => {
      // Assuming this is where the fetched user got stored
      const fetchedUser = getState().usersById[userId]

      // Assuming it has a "postIDs" field:

      const firstPostID = fetchedUser.postIDs[0]

      return dispatch(getPost(firstPostID))
    })
  } 
}

Пожалуйста, руководствоменя за это.

Спасибо

1 Ответ

1 голос
/ 07 ноября 2019

Redux - это библиотека, которая работает реактивно, поэтому она ожидает отправки действий, чтобы распространить изменения состояния на все подключенные функции.

Если для отправки действия установлен тайм-аут на 5 секунддля Redux это так же, как если бы вы подождали 5 секунд в реальной жизни, а затем позвонили dispatch(). Он просто ответит на это действие обновлением всех подключенных функций.

Ваш вопрос больше об обещаниях.

Есть ли вероятность, что fetchedUser не имеетобновляется еще во время выполнения отправки (getUser (userId)). затем?

Нет, потому что вы используете .then после действия getUser, и это гарантирует, что обещание fetchUser уже было разрешено,Может случиться так, что пользователь не был найден или что-то в этом роде, но в этом блоке вы можете убедиться, что вызов fetchUser уже завершен.

Поток будет выглядеть так:

  1. Вызов getUser (userId)
  2. Отправка GET_USER_REQUEST
  3. Вызов fetchUser ()
  4. Дождаться завершения fetchUser.
  5. Отправка GET_USER_SUCCESS
  6. Выполнить fetchedUser = getState().usersById[userId]
  7. И так далее ..

Что произойдет, если я напишу setTimeout (() => {dispatch ({type: 'GET_USER_SUCCESS' ', id, response})}, 5000) в fetchUser.then

В этом случае может запустить строку назначения fetchedUser без обновления состояния, так как я предполагаю, чтозадает пользователю действие GET_USER_SUCCESS, верно? Таким образом, если запрос занимает менее 5 секунд, он выполнит присвоение перед обновлением состояния с пользовательскими данными.

...