代码之家  ›  专栏  ›  技术社区  ›  NevrMore

使用Axios可观察的Redux的问题

  •  -1
  • NevrMore  · 技术社区  · 6 年前

    我正在尝试学习redux可观测值,但我似乎在让我的应用程序返回数据时遇到了问题。我不断得到下面的错误,我不知道我错在哪里,或者错误的真正含义是什么。

    行动:

    import { FETCH_DATA, FETCH_DATA_FAIL } from './constants';
    
    export const fetchData = exampleData => ({
    type: FETCH_DATA,
    payload: { exampleData }
    });
    
    export const fetchDataFail = () => ({
    type: FETCH_DATA_FAIL
    });
    

    史诗:

     import 'rxjs';
     import { FETCH_DATA, FETCH_DATA_FAIL } from './constants';
     import { fetchData  } from './actions';
     import axios from 'axios';
     import { Observable } from 'rxjs';
     import { mergeMap } from 'rxjs/operators';
     import { ofType } from 'redux-observable';
    
     export const exampleEpic = action$ =>
       action$.pipe(ofType(FETCH_DATA),
       mergeMap(action =>
         axios.get('https://jsonplaceholder.typicode.com/todos/1')
           .map(response => fetchData(response))
           .catch(error => Observable.ofType(FETCH_DATA_FAIL)))
    );
    

    减速器:

         import { FETCH_DATA, FETCH_DATA_FAIL } from './constants';
         import { combineReducers } from 'redux';
    
         const initialState = {};
    
         export const exampleData = (state = initialState, action) => {
           switch (action.type) {
             case FETCH_DATA:
               return action.payload
             case FETCH_DATA_FAIL:
               return {};
             default:
               return state;
           }
         };
    
         export default combineReducers({
           exampleData
         });
    

    示例组件:

    import React, { Component } from 'react';
    import { connect } from 'react-redux';
    import { fetchData } from './actions';
    
    class App extends Component {
    
      onClick = ()=>{
        this.props.fetchData();
      }
    
      render() {
        return (
          <div>
            <button onClick={this.onClick}><h1>Hello World</h1></button>
            {JSON.stringify(this.props.data) }
          </div>
        );
      }
    }
    
    const mapStateToProps = (state) => {
      return {
        data: state
      }
    };
    
    function mapDispatchToProps(dispatch) {
      return {
        fetchData: () => dispatch(fetchData())
      }
    };
    
    export default connect(
      mapStateToProps,
      mapDispatchToProps
    )(App);
    
    1 回复  |  直到 6 年前
        1
  •  9
  •   Praveen    4 年前

    使用 .then 正确的做法是使用rxjs的 from 函数,如下所示

     import 'rxjs';
     import { FETCH_DATA, FETCH_DATA_FAIL } from './constants';
     import { fetchData  } from './actions';
     import axios from 'axios';
     import { Observable, from } from 'rxjs';
     import { mergeMap, map } from 'rxjs/operators';
     import { ofType } from 'redux-observable';
    
     export const exampleEpic = action$ =>
       action$.pipe(ofType(FETCH_DATA),
       mergeMap(action =>
         from(axios.get('https://jsonplaceholder.typicode.com/todos/1'))
           .map(response => fetchData(response))
           .catch(error => Observable.ofType(FETCH_DATA_FAIL)))
    );
    

    另外,请确保导入 .map 来自rxjs的运算符

    更新:使用.pipe操作符的语法

    export const exampleEpic = action$ =>
      action$.pipe(
        ofType(FETCH_DATA),
        mergeMap(action => from(axios.get('https://jsonplaceholder.typicode.com/todos/1/'))
          .pipe(
            map(response => fetchData(response)),
            catchError(() => of(fetchDataFailure()))
          )
        )
      )