Thunks в последовательности на рендере - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть приложение, которое извлекает некоторую информацию о пользователе при рендере.Поэтому, когда приложение загружается в первый раз, оно извлекает данные с помощью функции getUserInformation ().Пользователю не нужно входить в систему вручную, приложение находится во внутренней сети компании.

export function getUserInformation() {
  return function (dispatch) {
    getUser()
      .then((data) => {
        dispatch(
          {type: GET_USER_SUCCESS, response: data}
        )
      })
      .catch((error) => {
        dispatch(
          {type: GET_USER_FAILURE, response: error}
        )
      })
  }
}

Теперь я хочу получить версию приложения, которая будет доступна во всем приложении.Но вызов API может быть запущен только после входа пользователя в систему (поэтому getUser () был успешно вызван).Должен ли я просто добавить

.then(getVersion())

в действие getUserInformation ()?Это не кажется чистым, но я понятия не имею, как я могу подойти к нему по-другому.

1 Ответ

0 голосов
/ 21 ноября 2018

Создатель действий - это подходящее место для последовательной отправки действий.Документация охватывает это :

Использование асинхронного промежуточного программного обеспечения, такого как Redux Thunk, безусловно, позволяет такие сценарии, как отправка нескольких отдельных, но связанных действий подряд, диспетчеризация действий для представления последовательности AJAXзапрашивать, отправлять действия, условно основанные на состоянии, или даже отправлять действие и сразу после этого проверять обновленное состояние.

В случае, если информацию о пользователе и действия версии необходимо проверять отдельно (они должны находиться в разныхмодули) или использоваться отдельно, создатели действий могут быть объединены.Это требует возврата обещаний, чтобы связать их.Это также показывает ограничение redux-thunk:

function getUserInformation() {
  return async (dispatch) => {
    try {
        dispatch(
          {type: GET_USER_SUCCESS, response: await getUser()}
        )
    } catch (error) {
        dispatch(
          {type: GET_USER_FAILURE, response: error}
        )
    }
  };
}

...

function getVersion() {
  return async (dispatch) => {...};
}

...

function getInitialData() {
  return async (dispatch, getState) => {
    await getUserInformation()(dispatch);
    // we need to use getState to check if there was an error
    // because getUserInformation returns a fulfilled promise any way
    await getVersion()(dispatch);
  };
}

Было бы целесообразно повторно выдать ошибку из getUserInformation, но было бы плохо, если бы она использовалась отдельно от getInitialData, потому чтоэто приведет к необработанному отказу.Альтернатива еще хуже - проверить, не было ли ошибки с getState().

. В этом сценарии требуется более сложное промежуточное программное обеспечение, чем redux-thunk, что очень просто - возможно, пользовательское промежуточное ПОэто основано на этом и способно обработать отклонения.

...