Reactjs Can';在redux操作中不执行异步
我已经使用redux thunk进行异步。它已使用此格式:Reactjs Can';在redux操作中不执行异步,reactjs,asynchronous,redux,react-router,redux-thunk,Reactjs,Asynchronous,Redux,React Router,Redux Thunk,我已经使用redux thunk进行异步。它已使用此格式: export function registerUser({email,password}){ return function(dispatch){ axios.post(`${ROOT_URL}/api/auth/signup`,{email,password}) .then(response =>{ dispatch({type:AUTH_USER
export function registerUser({email,password}){
return function(dispatch){
axios.post(`${ROOT_URL}/api/auth/signup`,{email,password})
.then(response =>{
dispatch({type:AUTH_USER});
localStorage.setItem('laravel_user_token',response.data.token);
browserHistory.push('/register');
})
.catch(response => dispatch(authError(response.data.error)));
}
}
现在,我想尝试执行一些异步注销操作,如下所示:
export function logoutUser() {
console.log("logout");
localStorage.removeItem('laravel_user_token');
return { type: LOGOUT_USER }
}
这就是工作,现在我打算在使用以下代码执行注销后重定向页面:
export function logoutUser() {
return dispatch => {
console.log("logout");
localStorage.removeItem('laravel_user_token');
return dispatch({ type: LOGOUT_USER })
.then(() =>
browserHistory.push("/")
);
}
}
我的问题是没有回复,甚至我的console.log(“logout”)也不工作。有一些变体可以执行它 1。通过承诺 正如您尝试的那样,这是使用
Promise
执行的,因此您的主要错误-表明您的函数没有返回Promise
改变你的行为
export function logOut() {
return (dispatch) => {
return new Promise((resolve) => {
dispatch({
type : LOGOUT_USER,
});
resolve();
}
}
您的操作处理程序可以是简单的reducer函数,这将改变状态
case 'LOGOUT_USER' : (state) => {
return Object.assign({}, state, {
autenticated : false
})
}
然后,从react组件调用它
hireLogoutClick = () => {
this.props.logOut().then(() => browserHistory.push('/');
}
logOut
函数return,它将在resolve()
步骤中调用回调函数。首先调用reducer函数,然后调用回调函数(传入的函数。然后
)
2。通过中间件 还有另一个变体,如何通过中间件执行此操作,并从reducer调用它,就像一个动作一样,中间件将捕获它并重定向,我认为更好,然后使用承诺 创建一个中间件
import { browserHistory } from 'react-router'
import { ROUTING } from '../constants/ActionTypes'
export const redirect = store => next => action => {
if(action){
if (action.type === ROUTING) {
browserHistory['push'](action.nextUrl)
}
}
return next(action)
}
绑起来
// Apply the middleware to the store
const middleware = routerMiddleware(browserHistory)
const store = createStore(
reducers,
applyMiddleware(middleware)
)
用法:)
您可以使用一些变体来执行它 1。通过承诺 正如您尝试的那样,这是使用
Promise
执行的,因此您的主要错误-表明您的函数没有返回Promise
改变你的行为
export function logOut() {
return (dispatch) => {
return new Promise((resolve) => {
dispatch({
type : LOGOUT_USER,
});
resolve();
}
}
您的操作处理程序可以是简单的reducer函数,这将改变状态
case 'LOGOUT_USER' : (state) => {
return Object.assign({}, state, {
autenticated : false
})
}
然后,从react组件调用它
hireLogoutClick = () => {
this.props.logOut().then(() => browserHistory.push('/');
}
logOut
函数return,它将在resolve()
步骤中调用回调函数。首先调用reducer函数,然后调用回调函数(传入的函数。然后
)
2。通过中间件 还有另一个变体,如何通过中间件执行此操作,并从reducer调用它,就像一个动作一样,中间件将捕获它并重定向,我认为更好,然后使用承诺 创建一个中间件
import { browserHistory } from 'react-router'
import { ROUTING } from '../constants/ActionTypes'
export const redirect = store => next => action => {
if(action){
if (action.type === ROUTING) {
browserHistory['push'](action.nextUrl)
}
}
return next(action)
}
绑起来
// Apply the middleware to the store
const middleware = routerMiddleware(browserHistory)
const store = createStore(
reducers,
applyMiddleware(middleware)
)
用法:)
返回分派({type:LOGOUT_USER})。然后(()=>browserHistory.push(“/”)代码>这将不起作用,因为分派不会在此处返回承诺,因此。然后返回分派({type:LOGOUT\u USER})没有意义然后(()=>browserHistory.push(“/”)
这不起作用,因为dispatch在这里不返回承诺,所以。那么就没有意义了。我如何添加objectAssign({},state,{authenticated:false})代码>在我的减速机里?。我尝试以下代码:case'LOGOUT_USER':(state)=>{objectAssign({},state,{authenticated:false});return dispatch({type:LOGOUT_USER})。然后(()=>browserHistory.push(“/”);}
。你能帮我修复代码@Dmitriy KovalenkoUpdated,要在我放置返回分派({type:LOGOUT_USER})的地方包含changing state的exmaple,然后(()=>browserHistory.push(“/”)因为在reducer中已经返回了objectAssign({},state,{authenticated:true})
@Dmitriy kovalenko如果调用action=>logoutUser
,它将返回Promise
,并调用reducer,reducer将更新您的状态,之后,操作解析Promise,并调用callback调用dispatch(logOut()),从react组件中如何添加objectAssign({},state,{authenticated:false})代码>在我的减速机里?。我尝试以下代码:case'LOGOUT_USER':(state)=>{objectAssign({},state,{authenticated:false});return dispatch({type:LOGOUT_USER})。然后(()=>browserHistory.push(“/”);}
。你能帮我修复代码@Dmitriy KovalenkoUpdated,要在我放置返回分派({type:LOGOUT_USER})的地方包含changing state的exmaple,然后(()=>browserHistory.push(“/”)因为在reducer中已经返回了objectAssign({},state,{authenticated:true})
@Dmitriy kovalenko如果调用action=>logoutUser
,它将返回Promise
,并调用reducer,reducer将更新您的状态,之后,操作将解析Promise,并从react组件调用callback调度(logOut())