【问题标题】:multiple api call actions in the redux thunkredux thunk 中的多个 api 调用操作
【发布时间】:2019-01-24 18:25:31
【问题描述】:

我正在使用 redux-thunk 。在这里,我有一个登录操作。在那个动作中,我正在调用一个 API,它会给我一些令牌,我必须将其存储在状态中。然后,在此操作成功后,我必须立即发出另一个 API 请求,该请求将在标头中包含此令牌并获取更多数据。基于此,我想重定向用户。

登录操作

import { generateToken } from '../APIs/login';
import HttpStatus from 'http-status-codes';
import { LOGIN_FAILED, LOGIN_SUCCESS } from '../constants/AppConstants';
import {  fetchUserJd } from './GetUserJd';
import history from '../history';

    export function fetchToken(bodyjson) {
        return (dispatch) => {
            getLoginDetails(dispatch, bodyjson);
        }
    }

    export function getLoginDetails(dispatch, bodyjson) {
        generateToken(bodyjson)
            .then((response) => {
                if (response.status === 200)
                    dispatch(sendToken(response.payload))
                else
                    dispatch(redirectUser(response.status));
            })
    }

    export function sendToken(data) {
        return {
            type: LOGIN_SUCCESS,
            data: data,
        }
    }

    export function redirectUser(data) {
        return {
            type: LOGIN_FAILED,
            data: data,
        }
    }

第二次行动

import { FETCHING_JOBDESCRIPTION_SUCCESS, FETCHING_DATA_FAILED,FETCHING_JOBS } from '../constants/AppConstants';
import { getUserJobs } from '../APIs/GetUserJd';
import history from '../history';

export function fetchUserJd(token) {
    console.log(token);
    return (dispatch) => {
        dispatch(fetchingJobDescription());
    }
};

export function getUserJd(dispatch, token) {
    getUserJobs(token)
        .then((response) => {
            if (response.status === 200)
                dispatch(sendUserJd(response.payload))
            else
                dispatch(fetchFailure(response.status));
        })
}

export function fetchFailure(data) {
    return {
        type: FETCHING_DATA_FAILED,
        data: data,
    }
}

export function sendUserJd(data) {
    return {
        type: FETCHING_JOBDESCRIPTION_SUCCESS,
        data: data,
    }
}

export function fetchingJobDescription() {
    return {
        type: FETCHING_JOBS
    }
}

从这里调用

handleClick(event) {
        event.preventDefault();
        var bodyJson = {
            "username": this.state.UserName,
            "password": this.state.password
        }
        this.props.fetchToken(bodyJson);
    }

如何在第一个请求成功后立即调用第二个操作。 ?

尝试过的方法->

componentWillReceiveProps(newProps) {
        console.log(newProps.token);
        if(newProps.token) {
            this.props.fetchUserJd(newProps.token);
        }
    }


export function sendUserJd(data) {
    if (data.data.length > 0) {
        history.push('/userJobs');
    } else {
        history.push('/createJob');
    }
    return {
        type: FETCHING_JOBDESCRIPTION_SUCCESS,
        data: data,
    }
}

【问题讨论】:

    标签: javascript reactjs redux react-redux react-thunk


    【解决方案1】:

    您可以不将其设置为 redux 状态。您需要返回成功操作调用以使用 promise .then 获取组件本身中的令牌,然后调用 this.props.sendToken(token);这实际上会将数据设置为状态并遵循您现有的流程。

    handleClick(event) {
            event.preventDefault();
            var bodyJson = {
                "username": this.state.UserName,
                "password": this.state.password
            }
            this.props.getLoginDetails(bodyJson).then((token) => {
               this.props.sendToken(token);
            });
        }
    

    在行动中

    const GET_LOGIN_DETAILS_SUCCESS = 'GET_LOGIN_DETAILS_SUCCESS';
    export function getLoginDetailsSuccess(data) {
        return {
            type: GET_LOGIN_DETAILS_SUCCESS,
            data: data,
        }
    }
    
        export function getLoginDetails(bodyjson) {
            generateToken(bodyjson)
                .then((response) => {
                    if (response.status === 200)
                        return dispatch(getLoginDetailsSuccess(response.payload))
                    else
                        dispatch(redirectUser(response.status));
                })
        }
    

    如果您有任何问题或觉得难以理解,请告诉我

    【讨论】:

    • 是的,但是我需要将该令牌存储在状态中,因为我需要在几乎每个组件中都有它
    • 好的。您通常在成功操作调用中将令牌设置为 redux 状态并从 componentWillReceiveProps 组件中的状态获取令牌,并使用 nextProps.token 与 this.props.token 进行检查,如果它们不同,则调用 this.props.sendToken(令牌);
    • 其实,我要做的是我必须一个接一个地调用两个动作,并且还要调度该数据。例如当用户尝试登录时,我发送一个将验证的请求,然后将给我一个令牌作为响应,我必须将其存储在状态中。在此之后,我必须立即再调用一个 api,如果数据存在,它将给我一些数据,然后我必须将用户重定向到 diff 视图或 diff virw。
    • 即使我告诉你同样的事情,你在 handleClick >> 中从组件发出动作调用,然后在动作中使用令牌调度成功动作调用 >> 成功动作调用返回类型和令牌>> 在 reducer 中,当该类型匹配时,您将使用 state.set 或 state.setIn 将令牌设置为 redux 状态 >> 现在,您将在定义了 handleClick 的组件中获取令牌 >> 您使用 redux connect 将该状态作为道具返回>> 现在,在 componentWillReceiveProps 中,您将获得传递给 this.props.sendToken(token); 的令牌。明白了吗?
    • 你应该这样做
    猜你喜欢
    • 2016-08-06
    • 2018-03-20
    • 1970-01-01
    • 2018-07-23
    • 2020-07-21
    • 2020-07-11
    • 2021-07-04
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多