redux-thunk对于异步调用提供了什么功能?

15 浏览
0 Comments

redux-thunk对于异步调用提供了什么功能?

我刚开始熟悉reduxredux-thunk

我尝试了下面的代码片段,使用reduxredux-thunk来处理async调用。

const redux = require('redux');
const thunk = require('redux-thunk').default;
const axios = require('axios');
const createStore = redux.createStore;
const applyMiddleware = redux.applyMiddleware;
const accessPoint = axios.create({
    baseURL: 'https://jsonplaceholder.typicode.com/',
    responseType: 'json',
    headers: {
        'Accept-Encoding': '',
    },
});
const FETCH_USER_PENDING = 'FETCH_USER_PENDING';
const FETCH_USER_FULFILLED = 'FETCH_USER_FULFILLED';
const FETCH_USER_REJECTED = 'FETCH_USER_REJECTED';
const initialState = {
    isLoading: false,
    users: [],
    error: '',
}
const fetchUserPending = () => {
    return {type: FETCH_USER_PENDING}
}
const fetchUserFulfilled = data => {
    return {type: FETCH_USER_FULFILLED, payload: data}
}
const fetchUserRejected = errorMessage => {
    return {type: FETCH_USER_REJECTED, payload: errorMessage}
}
const reducer = (state = initialState, action) => {
    const {type, payload} = action;
    switch(type){
        case FETCH_USER_PENDING: {
            return {
                ...state,
                isLoading: true,
            }
        }
        case FETCH_USER_FULFILLED: {
            return {
                isLoading: false,
                users: payload,
                error: ''
            }
        }
        case FETCH_USER_REJECTED: {
            return {
                isLoading: false,
                users: [],
                error: payload
            }
        }
        default: return state;
    }
}
const fetchUsers = () => {
    return function(dispatch){
        dispatch(fetchUserPending());
        accessPoint.get('users')
            .then(response => {
                dispatch(fetchUserFulfilled(response.data.map(user => user.name)))
            })
            .catch(error => {
                dispatch(fetchUserRejected(error.message));
            })
    }
}
const store = createStore(reducer, applyMiddleware(thunk));
store.subscribe(() => {
    console.log(store.getState());
})
store.dispatch(fetchUsers());

在CodeSandBox上的代码

这段代码完全正常,输出结果与预期相符。

也尝试了不使用thunk的相同示例,并进行了一些更改,

const redux = require('redux');
const axios = require('axios');
const createStore = redux.createStore;
const accessPoint = axios.create({
    baseURL: 'https://jsonplaceholder.typicode.com/',
    responseType: 'json',
    headers: {
        'Accept-Encoding': '',
    },
});
const FETCH_USER_PENDING = 'FETCH_USER_PENDING';
const FETCH_USER_FULFILLED = 'FETCH_USER_FULFILLED';
const FETCH_USER_REJECTED = 'FETCH_USER_REJECTED';
const initialState = {
    isLoading: false,
    users: [],
    error: '',
}
const fetchUserPending = () => {
    return {type: FETCH_USER_PENDING}
}
const fetchUserFulfilled = data => {
    return {type: FETCH_USER_FULFILLED, payload: data}
}
const fetchUserRejected = errorMessage => {
    return {type: FETCH_USER_REJECTED, payload: errorMessage}
}
const reducer = (state = initialState, action) => {
    const {type, payload} = action;
    switch(type){
        case FETCH_USER_PENDING: {
            return {
                ...state,
                isLoading: true,
            }
        }
        case FETCH_USER_FULFILLED: {
            return {
                isLoading: false,
                users: payload,
                error: ''
            }
        }
        case FETCH_USER_REJECTED: {
            return {
                isLoading: false,
                users: [],
                error: payload
            }
        }
        default: return state;
    }
}
const fetchUsers = (dispatch) => {
    dispatch(fetchUserPending());
    accessPoint.get('users')
        .then(response => {
            dispatch(fetchUserFulfilled(response.data.map(user => user.name)))
        })
        .catch(error => {
            dispatch(fetchUserRejected(error.message));
        })
}
const store = createStore(reducer);
store.subscribe(() => {
    console.log(store.getState());
})
fetchUsers(store.dispatch);

在CodeSandBox上的代码

这里,我没有使用redux-thunk将函数传递给store.dispatch(),而是将store.dispatch传递给fetchUsers()函数。根据不同的阶段,我向其分派操作。

令人困惑的是,当这两个代码片段(一个使用redux-thunk,一个不使用)产生完全相同的输出时,redux-thunk在异步调用中提供了什么。

如果这种写法有问题,请指正。

非常感谢你的建议。

0
0 Comments

Redux中间件系统和redux-thunk中间件提供了一种简洁的方法来表达异步操作。

1. 每次调用action creator时,不需要传递store.dispatch和store.getState。Redux的applyMiddleware API会为您处理这些。

2. 您还可以使用redux-thunk的withExtraArgument() API来将配置值注入到thunks中。

0