在 Axios 中使用 Redux-Observable 的问题

Posted

技术标签:

【中文标题】在 Axios 中使用 Redux-Observable 的问题【英文标题】:Issues Using Redux-Observable With Axios 【发布时间】:2019-06-04 19:00:12 【问题描述】:

我正在尝试学习 redux-observables,但我似乎在让我的应用程序返回数据时遇到了问题。我不断收到下面的错误,我不确定我哪里出错了或错误的实际含义。

错误:TypeError:axios__WEBPACK_IMPORTED_MODULE_3___default.a.get(...).map 不是函数

动作:

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);

【问题讨论】:

既然axios返回了一个promise,你需要使用.then而不是.map吗? 果然……成功了。 【参考方案1】:

使用 .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)))
);

另外,请确保从 rxjs 导入 .map 运算符

更新:使用 .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()))
      )
    )
  )

【讨论】:

嘿,我有类似的代码,但得到TypeError: Object(...)(...).map is not a function。使用"rxjs": "6.2.1""redux-observable": "^1.1.0" 有什么想法吗?谢谢 不再遵循此语法。从mergeMappipe( map() ....stuff ) 里面需要.pipe() 悉达多,你能不能分享一下新的语法,包括管道、地图和捕捉。

以上是关于在 Axios 中使用 Redux-Observable 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在另一个 axios 请求中使用 axios 响应数据

vue3中使用axios

Vue 中使用 axios

如何在 Vue (Typescript) 中使用 axios?

Axios使用总结

vue中使用axios