Reactjs Can';在redux操作中不执行异步

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

我已经使用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});
                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(“/”)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(“/”)objectAssign({},state,{authenticated:true})
@Dmitriy kovalenko如果调用action=>
logoutUser
,它将返回
Promise
,并调用reducer,reducer将更新您的状态,之后,操作将解析Promise,并从react组件调用callback调度(logOut())