javascript - 如何在分派(dispatch)到 reducer 之前从操作中调用函数?

标签 javascript reactjs react-redux

我正在开发一个 React Redux 应用程序。我有一个操作,在分派(dispatch)操作之前我会调用实用程序函数。

import GetDataFromAPIs from "../utils/menu-creator";
export const UPDATE_DATA = 'UPDATE_DATA';

export const updateData = () => {
    const newData = GetDataFromAPIs();

    return{
        type: UPDATE_DATA, 
        payload: newData
    };
};

而且,这是 GetDataFromAPIs.js 正在做的松散的事情:

import React from "react";
import axios from "axios";

const apiOneData = axios.get('/api/a');
const apiTwoData = axios.get('/api/b');


const GetDataFromAPIs = () => {
    axios.all([apiOneData, apiTwoData]).then(axios.spread((...responses) => {
        var firstDataSet = responses[0].data
        var secondDataSet = responses[1].data;
        var dataObject = [];

        dataObject.push(firstDataSet);
        dataObject.push(secondDataSet);

        return dataObject;

    })).catch(errors => {
        console.log("There was an error.");
    })
}

export default GetDataFromAPIs;

但是当应用程序运行时,newData 被设置为未定义。我试图单步执行 GetDataFromAPIs.js,但它一直跟踪到 axios.all,然后退出该函数。我在控制台中没有看到任何错误。

所以我猜测是在两个 axios.all 解析之前调度了 action。我认为这将是同步的(newData 将取回数据,然后将调度操作)。我这样做错了吗?

最佳答案

您需要明确告诉操作等待以异步获取该数据。为此,请进行以下更改:


您的 GetDataFromAPIs 函数应如下所示:

const GetDataFromAPIs = async () => {
    // everything in here stays the same
}

您的 updateData 函数应如下所示:

export const updateData = async (dispatch) => {
    const newData = await GetDataFromAPIs();

    return dispatch({
        type: UPDATE_DATA, 
        payload: newData
    });
};

请务必调度您的操作。

注意:

如果您还没有 redux-thunk 设置,那么您需要安装 npm 模块并更新您的 createStore 以查看像这样的东西:

// other imports
import { applyMiddleware, createStore } from 'redux'
import thunk from 'redux-thunk'

const store = createStore(rootReducer, applyMiddleWare(thunk))

关于javascript - 如何在分派(dispatch)到 reducer 之前从操作中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61051010/

相关文章:

javascript - 当我通过 Vue Router 导航时,我丢失了元素的内容

javascript - React 隐形 reCAPTCHA

javascript - setState 钩子(Hook)中的 Mutate prevState 更新 View 而不重新渲染。为什么?

javascript - 为我的第一个组件编写一个 Jest 测试

reactjs - 如何在 Gatsby SPA 中强制出现 "The onFormSubmit function in hbspt.forms.create requires jQuery. It was not run."错误

javascript - AmMap - 更新 map 数据后保持相同的缩放级别和位置

javascript - 使用 JavaScript 设置内联样式不起作用

reactjs - 在组件/容器中组织 React 应用程序

javascript - Redux 状态在 mapStateToProps 中未定义

javascript - 由 ng-repeat : collect states under one array in the $scope model? 创建的按钮列表