Правильный способ отправки избыточного действия из запроса - PullRequest
0 голосов
/ 03 октября 2018

Я использую redux-thunk, и у меня есть следующее действие:

export const fetchUserInfo = () => dispatch => {
  return fetchCurrentUser()
    .then(user => {
      dispatch(retrieveUser(user));

      if (user && user.settings && user.settings.storePageId) {
        dispatch(getStoreById(user.settings.storePageId));
      }

      return user;
    })
    .catch(err => {
      console.error('Fetching userinfo failed', err);
      return Promise.reject(err);
    });
};

fetchCurrentUser - это вызов API, определенный следующим образом:

export const fetchCurrentUser = () => authenticatedRequest('/customer');

Вот мой authenticatedRequest:

import { logoutUser } from '../../actions/auth';
export const authenticatedRequest = (url, opts = {}, req = request) => {
  if (!cachedTokenType || !cachedAccessToken) {
    logoutUser() // I want this to happen!! :(

    return Promise.reject(
      new Error(
        'Missing token_type & access_token needed to perform this request'
      )
    );
  }

  const headers = { ...defaultOpts.headers, ...(opts.headers || {}) };

  const authedOpts = {
    ...opts,
    headers: {
      ...headers,
      Authorization: `${cachedTokenType} ${cachedAccessToken}`
    }
  };

  return req(url, authedOpts);
};

Я хочу иметь возможность отправлять logoutUser () в моем функции authenticatedRequest, поэтому мне не нужно дублировать эту логику во всех местах, используя authenticatedRequest.Моя проблема в том, что я не знаю, как вызвать действие приставки из другого файла, а когда нет в реагирующем компоненте с connect.

1 Ответ

0 голосов
/ 03 октября 2018

I want to be able to dispatch logoutUser() in my authenticatedRequest func...

Я бы сказал, что, достигнув этого, authenticatedRequest делает больше, чем одно (аутентификация и, возможно, выход пользователей из системы).Со временем сложность может возрасти и усугубится, если вы захотите изменить redux-thunk на что-то другое.

Если вам все еще это нужно, вы можете распространять dispatch, чтобы отправлять другие действия:

const fetchCurrentUser = (dispatch) => authenticatedRequest(dispatch, '/customer')

const authenticatedRequest = (dispatch, url, opts = {}, req = request) => {
  if (YOUR_CONDITION) {
    dispatch(logoutUser())
  }
  ...
}

Лично я бы не стал этого делать, поскольку он подвергает dispatch внешним вызовам.Хотя это ваш выбор:)

Возможно ли справиться с logoutUser в fetchUserInfo действии?

const authenticatedRequest = (url, opts = {}, req = request) => {
  if (YOUR_CONDITION) {
    return Promise.reject('LOGOUT')
  }
  ...
}

const fetchUserInfo = () => dispatch => {
  return fetchCurrentUser()
    .then(user => {
      ...
    })
    .catch(err => {
      if (err === 'LOGOUT') {
        dispatch(logoutUser())
      }
    })
}
...