Redux中的异步操作

Pab*_*blo 32 javascript asynchronous reactjs redux redux-thunk

我有一个React应用程序,我需要使用Redux进行ajax调用(以便学习)到在线服务(异步).

这是我的商店:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import duedates from './reducers/duedates'


export default applyMiddleware(thunk)(createStore)(duedates);
Run Code Online (Sandbox Code Playgroud)

这是行动:

import rest from '../Utils/rest';

export function getDueDatesOptimistic(dueDates){
    console.log("FINISH FETCH");
    console.log(dueDates);
    return {
        type: 'getDueDate',
        dueDates
    }
}

export function waiting() {
    console.log("IN WAIT");
    return {
        type: 'waiting'
    }
}


function fetchDueDates() {
    console.log("IN FETCH");
    return rest({method: 'GET', path: '/api/dueDates'});
}

export function getDueDates(dispatch) {
    console.log("IN ACTION");
    return fetchDueDates().done(
        dueDates => dispatch(getDueDatesOptimistic(dueDates.entity._embedded.dueDates))
    )
}
Run Code Online (Sandbox Code Playgroud)

这是减速器:

export default (state = {}, action) => {
  switch(action.type) {
    case 'getDueDate':
        console.log("IN REDUCER")

        return state.dueDates = action.dueDates;
    default:
        return state
  }
}
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么.该组件正在完美地调用该操作.但后来我得到了这个错误:

错误:操作必须是普通对象.使用自定义中间件进行异步操作.

我想我使用了错误的反应中间件.我究竟做错了什么?

编辑

现在该操作正在调用reducer,但是在更改状态之后,reducer不会重新运行render方法

    case 'getDueDate':
        console.log("IN REDUCER")

        return state.dueDates = action.dueDates;
Run Code Online (Sandbox Code Playgroud)

ris*_*hat 29

我认为你应该使用compose函数,所以它就像

import {
  createStore,
  applyMiddleware,
  compose
} from 'redux';
import thunk from 'redux-thunk';
import duedates from './reducers/duedates'

export default compose(applyMiddleware(thunk))(createStore)(duedates);
Run Code Online (Sandbox Code Playgroud)

Thunk允许动作创建者返回一个函数而不是普通对象,所以你就像使用它一样

export function getDueDates() {
  return dispatch => {
    console.log("IN ACTION");
    fetchDueDates().done(
      dueDates => dispatch(getDueDatesOptimistic(dueDates.entity._embedded.dueDates))
    )
  };
}
Run Code Online (Sandbox Code Playgroud)

你正在返回一个Promise对象,这是问题的一部分.另一部分是还没有正确应用redux-thunk.我打赌compose应该解决问题.


Ale*_*lls 17

接受的答案是过时的,错误的或过于复杂的.以下是关于撰写主题的文档:

http://redux.js.org/docs/api/compose.html

所以我们可以这样做:

import {createStore, combineReducers, compose, applyMiddleware} from 'redux';
import thunk from 'redux-thunk';

const reducer = combineReducers({
    user: userReducer,
    items: itemsReducer
});


// here is our redux-store
const store = createStore(reducer,
    compose(applyMiddleware(thunk))
);
Run Code Online (Sandbox Code Playgroud)