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



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

更新:

所以我检查了以防万一,如果我已经安装了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
  )
);

这是我在action.js中的async动作:

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)));
}
下面是我如何从组件调用动作:
fetchStates(sessionID) {
    this.props.dispatch(fetchStates(sessionID));
}
# I bind this function in component's constructor 
this.fetchStates = this.fetchStates.bind(this);

最后,这是我的减速器

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

我想你的错误可能是由于:

  1. 你没有从你的动作创建者返回一个thunk(一个返回调度函数的函数),所以thunk中间件不会捕获它(也许你返回一个承诺代替?)
  2. 你没有按照dzeno的建议安装redux-thunk

我建议您安装redux-logger中间件,并将其作为最后一个添加到您的商店中间件中,删除如果返回一个错误您不需要的promise中间件。通过这种方式,所有的动作都被记录在控制台(前一个状态,当前动作,下一个状态),你可以调试你返回的没有被thinkmiddleware"消化"的动作对象类型。

听起来你好像还没有安装/setup redux-thunk。

按常规方式安装npm包:

npm install --save redux-thunk

下面是一个应用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
}

相关内容

  • 没有找到相关文章

最新更新