redux-thunk对于异步调用提供了什么功能?
redux-thunk对于异步调用提供了什么功能?
我刚开始熟悉redux
和redux-thunk
。
我尝试了下面的代码片段,使用redux
和redux-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());
这段代码完全正常,输出结果与预期相符。
也尝试了不使用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);
这里,我没有使用redux-thunk
将函数传递给store.dispatch()
,而是将store.dispatch
传递给fetchUsers()
函数。根据不同的阶段,我向其分派操作。
令人困惑的是,当这两个代码片段(一个使用redux-thunk
,一个不使用)产生完全相同的输出时,redux-thunk
在异步调用中提供了什么。
如果这种写法有问题,请指正。
非常感谢你的建议。