Диспетчеризация действий в Redux во время асинхронного запроса API с использованием избыточного потока - PullRequest
0 голосов
/ 14 января 2020

Я новичок в редуксе и реакции. Я также проверил несколько способов, чтобы решить мою проблему, но, похоже, я не продвигаюсь вперед.

Я намерен выполнить асинхронную операцию с использованием приставки после урока https://github.com/reduxjs/redux-thunk, но у меня есть проблема в том, что функция sendApplication () не отправляет действие nextPage () Также не работает функция hitUrl (). Я был по этим вопросам в течение нескольких дней. Кто-то должен помочь мне, пожалуйста.

import React from 'react';
import { withStyles} from '@material-ui/styles';
import { FormLabel, TextField, Button } from '@material-ui/core';
import {connect} from 'react-redux';
import { nextPage, previousPage, enableBtnAvailability} from '../../actions/formPageController';
import { updateTextValueAvailability, clearField } from '../../actions/formInputController';
import { useStyles } from '../Styles/formStyles';
import { ValidatorForm, TextValidator} from 'react-material-ui-form-validator';
import sendApplication from '../../utility/sendRequest';
import { bindActionCreators } from 'redux';
const axios = require('axios');


const AvailablityTab=  withStyles({
  
})((props) => {
    console.log(props);
    
    const handleChange=(e)=>{
        const name= e.target.name;
        const value = e.target.value;
        const {updateTextValueAvailability} = props;
        updateTextValueAvailability(name,value);

        let unfilledFormFieldArray = props.text.filter((item)=> {
          console.log(item);
          return item.value=== "";
        })
        console.log(unfilledFormFieldArray);
        console.log(unfilledFormFieldArray.length);
        if(unfilledFormFieldArray.length ===0){
          const {enableBtnAvailability} = props;
          enableBtnAvailability();
         
        } 
        
    }

    const handleSubmit=()=>{
      //const {postApplication} = props;
      sendApplication();
      console.log(props);
     
      console.log('he submit');

    }


    const hitUrl = async function () {
      //alert('hi')
      try {
          console.log(3);
        const response = await axios.get('http://localhost:1337/api/v1/application/fetch-all');
        console.log(response);
        return response;
  
      } catch (error) {
        console.error(error);
      }
    };
  
  
  
   const sendApplication = () => {
      console.log(4);
      console.log(props);
      return function(props) {
        console.log('xyz');
        console.log(props);
        const {nextPage} = props; 
          // dispatch(nextPage());
          nextPage();
          console.log(5);
          alert('hi2')
        return hitUrl().then(
          () => {
              console.log('thunk success');
              nextPage();
          },
          () => {
              console.log('thunk error');
              //props.dispatch(previousPage())
          },
        );
      };
    }
  
    
    
    const handlePrevious=()=>{
      const {previousPage} = props;
      previousPage();
 }


    console.log(props);
    const classes = useStyles();
    let validationRule = ['required'];
    let errorMessages = ['This field is required'];
    return (
  <div className="formtab">
  <ValidatorForm //ref="form"
                onSubmit={handleSubmit}
                onError={errors => console.log(errors)}
            >
      {props.text.map((each)=>{
        let onFocus = false;
        if(each.id === 1){
          onFocus = true;
        }
          
          return(<div className={classes.question} key={each.id}>
        <FormLabel className={classes.questionLabel} component="legend">{each.label}</FormLabel>
        <TextValidator
                id={"filled-hidden-label"}
                className={classes.textField}
                hiddenLabel
                variant="outlined"
                fullWidth
                name={each.name}
                onChange={handleChange}
                value={each.value}
                margin= "none"
                placeholder={each.placeholder}
                validators={validationRule}
                    errorMessages={errorMessages}
                autoFocus= {onFocus}
            />
      </div>)
      })}

      
      <div className={classes.buttondiv} >
      <Button className={classes.prev} variant="contained" onClick={handlePrevious}>Previous</Button>
      <Button className={classes.next} variant="contained" type="submit" disabled={!props.btnActivator} >Submit</Button>
      </div>

    </ValidatorForm>  
  </div>  
 
    
)});


const mapStateToProps= (state)=>{
  const availablity = state.availabilityQuestion;
  return {
      text: availablity.text,
      radio: availablity.radio,
      btnActivator: state.btnActivator.availability
  }
}

const mapDispatchToProps = dispatch => bindActionCreators({
  postApplication: sendApplication,
  previousPage,
  enableBtnAvailability,
  updateTextValueAvailability,
  nextPage,
  clearField

}, dispatch)

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

1 Ответ

1 голос
/ 14 января 2020

Поскольку sendApplication возвращает функцию, но не выполняет ее, вы можете вызвать ее следующим образом:

sendApplication()(props); // it looks like you expect props to be passed to your function

Это должно успешно выполнить вашу функцию nextPage и вернуть значение, возвращаемое hitUrl.

Альтернативой может быть выполнение функции вместо ее возврата

sendApplication(props);
...
const sendApplication = (props) => {
  console.log('xyz');
  console.log(props);
  const {nextPage} = props; 
  // dispatch(nextPage());
  nextPage();
  console.log(5);
  alert('hi2')
  return hitUrl().then(
    () => {
      console.log('thunk success');
      nextPage();
    },
    () => {
      console.log('thunk error');
      //props.dispatch(previousPage())
    },
  );
};

Теперь мы удалили внутреннюю функцию и просто вместо этого вызвали ее напрямую. Теперь вызов sendApplication вернет возвращаемое значение hitUrl.

...