Попытка получить данные с помощью axios.get (), но обещание никогда не возвращается

В настоящее время я пытаюсь обновить редуктор Redux, используя запрос на получение https://jsonplaceholder.typicode.com, я могу свернуть этот сайт со своего ноутбука в порядке, но когда я пытаюсь использовать axios.get (URL / данные) из моего приложения, данные никогда не регистрируются, поэтому я предполагаю, что обещание никогда не вернется? Я нахожусь за прокси, но у меня настроены NodeJs для прокси, поэтому я не уверен, нужно ли мне передавать некоторые дополнительные данные в axios, связанные с прокси, или не выполнять внешние запросы GET. В основном логика приложения должна разворачиваться следующим образом:

GET Data from site with axios and is logged in firefox web console->reducer is passed payload from GET-> reducer fills each object in data into an array->View updated listing all objects in array on screen with the .map function.

Вот редуктор ниже, который ПОЛУЧАЕТ данные и обновляет хранилище:

import axios from 'axios';

import { SUCCESS } from 'app/shared/reducers/action-type.util';

export const ACTION_TYPES = {
  GET_APP_COMMENTS: 'applicationComments/GET_COMMENTS'
};

const initialState = {
  postId: 1,
  id: 1,
  name: 'testname',
  email: 'testemail',
  body: 'body'
};

export type ApplicationCommentsState = Readonly<typeof initialState>;

    export default (state: ApplicationCommentsState = initialState, action): ApplicationCommentsState => {
      switch (action.type) {
        case SUCCESS(ACTION_TYPES.GET_APP_COMMENTS):
          const { data } = action.payload;
          return {
            ...state,
            postId: data.postId,
            id: data.id,
            name: data.name,
            email: data.email,
            body: data.body
          };
        default:
          return state;
      }
    };

    export const getComments = () => ({
      type: ACTION_TYPES.GET_APP_COMMENTS,
      payload: axios.get('https://jsonplaceholder.typicode.com/comments')
      .then(res => {
        console.info('got here' + res);
      })
    });

Я установил этот редуктор в файле Redux index.js, где я объединяю все редукторы:

import { combineReducers } from 'redux';
import { loadingBarReducer as loadingBar } from 'react-redux-loading-bar';

import authentication, { AuthenticationState } from './authentication';
import applicationProfile, { ApplicationProfileState } from './application-profile';
import applicationComments, { ApplicationCommentsState } from './application-comments'; // Is this the correct way to import the comments reducer?

import administration, { AdministrationState } from 'app/modules/administration/administration.reducer';
import userManagement, { UserManagementState } from 'app/modules/administration/user-management/user-management.reducer';
import register, { RegisterState } from 'app/modules/account/register/register.reducer';
import activate, { ActivateState } from 'app/modules/account/activate/activate.reducer';
import password, { PasswordState } from 'app/modules/account/password/password.reducer';
import settings, { SettingsState } from 'app/modules/account/settings/settings.reducer';
import passwordReset, { PasswordResetState } from 'app/modules/account/password-reset/password-reset.reducer';

export interface IRootState {
  readonly authentication: AuthenticationState;
  readonly applicationProfile: ApplicationProfileState;
  readonly applicationComments: ApplicationCommentsState;
  readonly administration: AdministrationState;
  readonly userManagement: UserManagementState;
  readonly register: RegisterState;
  readonly activate: ActivateState;
  readonly passwordReset: PasswordResetState;
  readonly password: PasswordState;
  readonly settings: SettingsState;
  /* jhipster-needle-add-reducer-type - JHipster will add reducer type here */
  readonly loadingBar: any;
}

const rootReducer = combineReducers<IRootState>({
  authentication,
  applicationProfile,
  applicationComments,
  administration,
  userManagement,
  register,
  activate,
  passwordReset,
  password,
  settings,
  /* jhipster-needle-add-reducer-combine - JHipster will add reducer here */
  loadingBar
});

export default rootReducer;

Я вызываю метод getComments, который был передан в качестве опоры в следующем компоненте, это должно вызвать console.info, но это не так, и компонент все равно просто отрисовывается:

import './appView.css';

import React from 'react';
import { Link } from 'react-router-dom';
import { CommentsSection } from './appView-componets';
import { connect } from 'react-redux';
import { Container } from 'reactstrap';

import { getSession } from 'app/shared/reducers/authentication';
import { getComments } from 'app/shared/reducers/application-comments';

export interface IAppViewState {
  dropdownOpen: boolean;
}

export interface IAppViewProp extends StateProps, DispatchProps, IAppViewState {}

export class AppView extends React.Component<IAppViewProp> {
  state: IAppViewState = {
    dropdownOpen: false
  };

  componentDidMount() {
    this.props.getSession();
    this.props.getComments();
  }

  toggleCatagories = () => {
    this.setState({ dropdownOpen: !this.state.dropdownOpen });
  };

  render() {
    const comments = this.props;
    console.info('comments: ' + comments);
    return (
      <div>
        <CommentsSection comments = {comments} />
      </div>
    );
  }
}

const mapStateToProps = storeState => ({
  account: storeState.authentication.account,
  isAuthenticated: storeState.authentication.isAuthenticated,
  comments: storeState.applicationComments.comments
});

const mapDispatchToProps = { getSession, getComments };

type StateProps = ReturnType<typeof mapStateToProps>;
type DispatchProps = typeof mapDispatchToProps;

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(AppView);

Используете ли вы какое-либо промежуточное ПО для асинхронных действий? Redux Thunk или Sagas?

seanulus 31.10.2018 20:44

Да thunk используется

Reacter23 01.11.2018 09:55

Используя redux thunk, вы должны преобразовать getComments() в преобразователь, который получает dispatch в качестве аргумента, выполняет асинхронную выборку и затем отправляет чистое действие с результатами.

shaddyshad 20.05.2020 17:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
491
2

Ответы 2

Существуют библиотеки с поддержкой redux, такие как RxJs (Observables), Redux Saga, Redux Thunk и другие, которые интегрированы с Redux, и их можно использовать для обработки действий и взаимодействия с серверной частью в сочетании с axios. Если вы хотите использовать только axios (библиотеку для прямого обращения к серверу), вам нужно обернуть вызов так, чтобы вы сначала отправили ex. Действие GET_COMMENTS_START без полезной нагрузки (возможно, URL-адреса) и внутри редуктора, вы вызываете сервер с помощью axios. Когда обещание axios разрешено, вы должны запустить другое действие, например GET_COMMENTS_SUCCESS, которое затем вернет данные, которые будут вашей полезной нагрузкой, а затем вы сможете получить их через props. Этот подход может работать, но вам следует использовать библиотеки, специфичные для redux, такие как ReduxThunk или RxJs, потому что код намного более согласован и удобен в обслуживании. Полезные ссылки :

  1. https://rxjs-dev.firebaseapp.com/
  2. https://redux-saga.js.org/
  3. https://github.com/reduxjs/redux-thunk

Я попробовал запрос в своем приложении, и, похоже, он работает нормально. Я не уверен, что вы правильно настроили действие для использования промежуточного программного обеспечения thunk. Может быть, попробуй.

export const getCommentSuccess = (comments) => {
    return {
        type: ACTION_TYPES.GET_APP_COMMENTS,
        comments
    }
}

export const getComments = () => {
    return function(dispatch) {
        return axios.get('https://jsonplaceholder.typicode.com/comments').then(response => {
            console.info(response) //This should be the returned comments
            dispatch(getCommentSuccess(response));
        }).catch(error => {
            throw(error);
        });
    };

И убедитесь, что ваше промежуточное ПО правильно импортировано в ваш магазин.

import thunkMiddleware from 'redux-thunk';

const store = createStore(rootReducer, 
    applyMiddleware(
        thunkMiddleware
    )
);

Отличный ответ, чувак. Я думаю, что использование преобразователей, таких как redux-thunk, - лучший способ обрабатывать асинхронные действия.

shaddyshad 20.05.2020 17:05

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