REDUX THUNK ASYNC ждут возвращения промежуточного ПО Promise - PullRequest
0 голосов
/ 14 марта 2019

У меня проблема, я использую Redux Thunk в качестве промежуточного программного обеспечения API, и он прекрасно работает, когда просто обновляет состояние Redux.Однако есть части моего кода, которые требуют, чтобы я получил ответ от API запроса, а не ждал, пока он пройдет через хранилище избыточных данных. Как я могу «обещать» эту часть?

мой код для вызоваAPI с axios:

export async function callApi(apiRoutes, method, params) {
  method = method.toUpperCase();
  let apiArr = apiRoutes.split('/')
  let newApiRoute = await Promise.all(apiArr.map(async (queryBreakDown, index) => {
    let value
    if (queryBreakDown.indexOf(':') > -1) {
      queryBreakDown = queryBreakDown.replace(':', '');
      if (!params) throw Error('No Params');
      value = params[`${queryBreakDown}`];
      delete params[`${queryBreakDown}`];
      return value;
    } else {
      value = queryBreakDown
    }
    return value
  }))
  newApiRoute = await newApiRoute.join('/')

  // NOTE: add pagination queries
  if (params && params.count) {
    newApiRoute += '?count=' + params.count
    delete params.count
    if (params.page) {
      newApiRoute += '&page=' + params.page
      delete params.page
    }
    //NOTE: add filters to query
    if (params.filter) {
      for (var property in params.filter) {
        newApiRoute += `&filter[${property}]=` + params.filter[`${property}`]
      }
      delete params.filter
    }
  }

  // NOTE: add file upload queries
  if (params && params.fileType && !params.count) {
    newApiRoute += '?fileType=' + params.fileType
    delete params.fileType
  }

  let data = params ? params : null
  // cookie.set('user_token', '123123123');
  // cookie.remove('user_token', { path: '' });
  let accessToken = cookie.get('user_token');
  let headers = {};
  if (accessToken) {
    headers['Authorization'] = `Bearer ${accessToken}`;
  }
    headers['Content-Type'] =  'application/json';
  const response = await axios({
    method: method,
    baseURL: host + '/api',
    url: newApiRoute,
    headers,
    data
  });

  return response
}

мое промежуточное ПО API редуктора thunk:

export default store => next => (action) => {

  const apiRoutes = action[CALL_API];


  const { method, types, params } = action;

  next({ type: types[0] });

  return callApi(apiRoutes, method, params).then(
    response => next({
      response,
      type: types[1],
    }), error => next({
      error: (error && error.message) || 'Something bad happened',
      type: types[2]
    })
  )
}

функция, из которой мне нужно немедленно получить возвращаемое значение, откуда getS3UploadUrl отправляет getS3UploadUrl в APImiddleware:

  let signedURL = getS3UploadUrl({
      fileType: compressedImage.type
    })

вероятно, мне нужно возвращаемое значение для signURL в качестве ответа на запрос API

Однако signatureURL не определено.

1 Ответ

0 голосов
/ 14 марта 2019
function mapDispatchToProps (dispatch) {
  return {
    getS3UploadUrl: function(params) {
      return dispatch(getS3UploadUrl(params))
    }
  }
}

я не набрал RETURN для отправки OMG .. face palm.

Также я заметил, что было бы лучше, если бы моя функция callApi была бы синхронной, а не асинхронной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...