Redux-thunk异步操作:使用自定义中间件进行异步操作

dze*_*eno 6 redux redux-thunk react-redux

redux-thunk用于异步操作和babel-polyfill承诺.我收到以下错误:Error: Actions must be plain objects. Use custom middleware for async actions.

我通过包含redux-promise在我的中间件中解决了这个问题.我不确定为什么必须使用它redux-promise来解决此问题,因为Redux文档中的所有示例都使用babel-polyfill.我应该继续使用redux-promise还是可能会遇到一些问题babel-polyfill

babel-polyfill 包含在我的应用入口点:

import 'babel-polyfill';

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';

import App from './components/App.jsx';
import store from './store.jsx';

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>
    , document.querySelector('.container'));
Run Code Online (Sandbox Code Playgroud)

更新:

所以我检查以防万一我已redux-thunk安装.它在我的package.json中.这是我的store.js

import thunkMiddleware from 'redux-thunk';
import promise from 'redux-promise'

export default store = createStore(
  rootReducer,
  defaultState,
  applyMiddleware(
    thunkMiddleware,
    promise
  )
);
Run Code Online (Sandbox Code Playgroud)

这是我在action.js中的异步操作:

function receiveStates(json) {
    return {
        type: RECEIVE_STATES,
        states: json.states,
    };
}

export function fetchStates(uuid) {
    return dispatch =>
        fetch(`https://my-api.com/session/${uuid}`)
        .then(response => response.json())
        .then(json => dispatch(receiveStates(json)));
}
Run Code Online (Sandbox Code Playgroud)

以下是我从组件调用操作的方法:

fetchStates(sessionID) {
    this.props.dispatch(fetchStates(sessionID));
}
# I bind this function in component's constructor 
this.fetchStates = this.fetchStates.bind(this);
Run Code Online (Sandbox Code Playgroud)

最后,这是我的减速机:

function statesReducer(state = null, action) {
    switch (action.type) {
        case RECEIVE_STATES:
            return { ...state, states: action.states };
        default:
            return state;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ana 5

我认为您的错误可能是由于:

  1. 您不会从动作创建者那里返回thunk(函数返回调度函数),因此Thunk中间件不会捕获它(也许您返回的是Promise?)
  2. 您尚未按照dzeno的建议安装redux-thunk

我建议您安装redux-logger中间件,并将其作为最后一个添加到商店中间件,删除承诺的中间件,如果返回thunk,则不需要该中间件。这样,所有操作都将记录在控制台中(上一个状态,当前操作,下一个状态),并且您可以调试返回的操作对象类型,而该对象对象并未被thunk中间件“消化”。


bio*_*tal 1

听起来您还没有安装/设置redux-thunk

您可以按照通常的方式安装 npm 包:

npm install --save redux-thunk
Run Code Online (Sandbox Code Playgroud)

redux-thunk这是应用中间件的示例

getStore.js

import { createStore, applyMiddleware } from 'redux'
import thunk from 'redux-thunk'

const getStore = ({combined, initial}) =>{
    var store = createStore(combined, initial, applyMiddleware(thunk))
    return store
}

export{
    getStore
}
Run Code Online (Sandbox Code Playgroud)