Рекурсивный Действие Call в Reactjs - PullRequest
0 голосов
/ 26 июня 2018

У меня есть сценарий для реализации обновления токена авторизации. В этом сценарии я реализовал общее действие для каждого типа действий (Post, Get, Delete) и вызывал их с параметрами.

export function Get(param) {
return function (dispatch) {
    var query = param ? !!param.Query ? param.Query : "" : "";
    var funtionName = param ? param.FunctionName : "";
    var url = endPointUrl + funtionName;
    var offset = param.Offset ? param.Offset : "0";
    var limit = param.Limit ? param.Limit : "10";
    const config = { headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem('access-token') } };
    return new Promise((resolve, reject) => {
        axios.get(url, config).then((response) => {
            dispatch({ type: 'FETCH_SUCCEED_' + param.Caller, payload: response.data })
            resolve(response.data);
        }).catch((error) => {
                if (error.request.status == "401" && error.request.statusText == "RB.Exception.TokenExpiredException") {
                    refreshToken().then(() => {
                        dispatch(Get(param));
                    });
                }
            else {
                dispatch({ type: 'FETCH_ERROR_' + param.Caller, payload: error })
                reject(error);
            }

        })
    })
}

всякий раз, когда я получаю TokenExpiredException, я вызываю refreshToken (), а затем снова (рекурсивно) вызываю текущее действие, , поэтому я не могу использовать «then» в своем компоненте . Есть ли у вас решение об использовании "обещание" или "тогда"? Мне нужно сделать некоторые сообщения в компоненте после завершения действия.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы должны вернуть ваше второе обещание, которое return dispatch(Get(param)); Пожалуйста, попробуйте следующий код

export function Get(param) {
return function (dispatch) {
    var query = param ? !!param.Query ? param.Query : "" : "";
    var funtionName = param ? param.FunctionName : "";
    var url = endPointUrl + funtionName;
    var offset = param.Offset ? param.Offset : "0";
    var limit = param.Limit ? param.Limit : "10";
    const config = { headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem('access-token') } };
    return new Promise((resolve, reject) => {
        axios.get(url, config).then((response) => {
            dispatch({ type: 'FETCH_SUCCEED_' + param.Caller, payload: response.data })
            resolve(response.data);
        }).catch((error) => {
                if (error.request.status == "401" && error.request.statusText == "RB.Exception.TokenExpiredException") {
                    refreshToken().then(() => {
                        return dispatch(Get(param));
                    });
                }
            else {
                dispatch({ type: 'FETCH_ERROR_' + param.Caller, payload: error })
                reject(error);
            }

        })
    })
}
0 голосов
/ 26 июня 2018

Как то так?

export function Get(param) {
    return function (dispatch) {
        var query = param ? !!param.Query ? param.Query : "" : "";
        var funtionName = param ? param.FunctionName : "";
        var url = endPointUrl + funtionName;
        var offset = param.Offset ? param.Offset : "0";
        var limit = param.Limit ? param.Limit : "10";
        const config = { headers: { 'Authorization': 'Bearer ' + sessionStorage.getItem('access-token') } };
        return new Promise((resolve, reject) => {
            axios.get(url, config).then((response) => {
                dispatch({ type: 'FETCH_SUCCEED_' + param.Caller, payload: response.data })
                resolve(response.data);
            }).catch((error) => {
                if (error.request.status == "401" && error.request.statusText == "RB.Exception.TokenExpiredException") {
                    resolve(withRefresh(dispatch, param));
                }
                else {
                    dispatch({ type: 'FETCH_ERROR_' + param.Caller, payload: error })
                    reject(error);
                }

            })
        })
    }
}

function withRefresh(dispatch, param) {
    return refreshToken().then(() => {
        return dispatch(Get(param));
    });
}
...