javascript - Redux 中的异步操作

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

这是 Action :

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

这是 reducer :

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

        return state.dueDates = action.dueDates;
    default:
        return state
  }
}

我不明白我做错了什么。从组件中完美地调用了该操作。但是后来我得到了这个错误:

Error: Actions must be plain objects. Use custom middleware for async actions.

我想我用错了 react-thunk 中间件。 我做错了什么?

编辑

现在 action 正在调用 reducer,但 reducer 在更改状态后不会重新运行 render 方法

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

        return state.dueDates = action.dueDates;

最佳答案

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

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

export default compose(applyMiddleware(thunk))(createStore)(duedates);

Thunk 允许 Action 创建者返回函数而不是普通对象,因此您可以像这样使用它

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

您正在返回一个 Promise 对象,这是问题的一部分。另一部分是 redux-thunk 没有被正确应用。我敢打赌 compose 应该可以解决问题。

关于javascript - Redux 中的异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35530547/

相关文章:

javascript - 面向对象的 Javascript 错误对象不是函数

javascript - 如何用 Jest 模拟 DataTransfer

Angular 5 : Can't update template with async pipe

ios - 将异步 Gif 加载到滚动的 UICollectionView

css - Styled-components 引用同级组件的 props

javascript - jquery 中的 .bind 方法不起作用

javascript - 当我在 css 中使用 margin auto 属性时,如何使用 javascript 获取 margin left size

c# - 如何连续为两个异步任务使用加载微调器

javascript - React Router 静默推送

javascript - ReactJS:setTimeout() 不工作?