Javascript 为什么在redux promise中.then()未定义?

Javascript 为什么在redux promise中.then()未定义?,javascript,reactjs,redux,Javascript,Reactjs,Redux,我试图在redux状态更新后触发一个事件,所以我运行了一个承诺 logoutHandler = (event) => { console.log("logout Handler") event.preventDefault() window.FB.logout() this.props.LoggedIn(false).then(() => { this.props.history.replace('/signup'); }) }

我试图在redux状态更新后触发一个事件,所以我运行了一个承诺

logoutHandler = (event) => {
    console.log("logout Handler")
    event.preventDefault()
    window.FB.logout()
    this.props.LoggedIn(false).then(() => {
        this.props.history.replace('/signup');
    })
}
注意这一点

  this.props.LoggedIn(false).then(() => {
            this.props.history.replace('/signup');
        })
其中
.LoggedIn(false)
是一个redux操作

这是一个错误

无法读取未定义的属性“then”

这是我的重做动作

export const LoggedIn  = (isLoggedIn) => {
  return function (dispatch) {
    dispatch({
      type: USER_LOGGED_IN ,
      payload: isLoggedIn
    })
  }
}

问题:有人能告诉我我在这里做错了什么吗?

你的Redux行动没有回报承诺。您可以创建并返回一个新的承诺

export const LoggedIn  = (isLoggedIn) => {
  return function (dispatch) {
    return new Promise((resolve, reject) => {
         dispatch({
             type: USER_LOGGED_IN ,
             payload: isLoggedIn
         })
         resolve();
    })
  }
}
或者从redux操作本身中执行history.replace

export const LoggedIn  = (isLoggedIn, history) => {
  return function (dispatch) {
    dispatch({
      type: USER_LOGGED_IN ,
      payload: isLoggedIn
    });
    history.replace('/signup');
  }
}


logoutHandler = (event) => {
    console.log("logout Handler")
    event.preventDefault()
    window.FB.logout()
    this.props.LoggedIn(false, this.props.history);
}

你的Redux行动没有回报承诺。您可以创建并返回一个新的承诺

export const LoggedIn  = (isLoggedIn) => {
  return function (dispatch) {
    return new Promise((resolve, reject) => {
         dispatch({
             type: USER_LOGGED_IN ,
             payload: isLoggedIn
         })
         resolve();
    })
  }
}
或者从redux操作本身中执行history.replace

export const LoggedIn  = (isLoggedIn, history) => {
  return function (dispatch) {
    dispatch({
      type: USER_LOGGED_IN ,
      payload: isLoggedIn
    });
    history.replace('/signup');
  }
}


logoutHandler = (event) => {
    console.log("logout Handler")
    event.preventDefault()
    window.FB.logout()
    this.props.LoggedIn(false, this.props.history);
}

你需要回报一个承诺

因此,你可以这样做:

logoutHandler = (event) => {
  event.preventDefault()
  window.FB.logout()
  return this.props.LoggedIn(false).then(() => {
    this.props.history.replace('/signup');
    return Promise.resolve(); // Just return a resolved promise
  })
}

你需要回报一个承诺

因此,你可以这样做:

logoutHandler = (event) => {
  event.preventDefault()
  window.FB.logout()
  return this.props.LoggedIn(false).then(() => {
    this.props.history.replace('/signup');
    return Promise.resolve(); // Just return a resolved promise
  })
}

根据
redux thunk
doc,您应该从内部函数返回
Promise
以使用
。然后
执行操作

来自内部函数的任何返回值都将作为分派本身的返回值。这便于协调异步控制流,thunk action创建者彼此调度并返回等待彼此完成的承诺:

看一下文件


可能的代码已由
Shubham Khatri
共享。根据
redux thunk
doc,您应该从内部函数返回
Promise
,以使用
。然后执行操作

来自内部函数的任何返回值都将作为分派本身的返回值。这便于协调异步控制流,thunk action创建者彼此调度并返回等待彼此完成的承诺:

看一下文件


可能的代码已经被Shubham Khatri共享

要实现与状态更新相关的任何内容,可以使用react生命周期方法componentDidUpdate()。每当redux reducer返回新状态时,整个react应用程序都会重新呈现。渲染后,将对每个组件执行componentDidUpdate方法

componentDidUpdate()在更新发生后立即调用。初始渲染时不调用此方法


要实现任何与状态更新相关的功能,可以使用react生命周期方法componentdiddupdate()。每当redux reducer返回新状态时,整个react应用程序都会重新呈现。渲染后,将对每个组件执行componentDidUpdate方法

componentDidUpdate()在更新发生后立即调用。初始渲染时不调用此方法



您是否从
LoggedIn
操作返回
promise
?您可以分享
LoggedIn
操作的代码吗?您的redux操作看起来怎么样
LoggedIn
?你能显示它的代码吗?@Prasun用Redux更新了我的代码action@ShubhamKhatri请检查我的更新代码您是否从
LoggedIn
操作返回
promise
?您可以分享
LoggedIn
操作的代码吗?您的redux操作看起来怎么样
LoggedIn
?你能显示它的代码吗?@Prasun用Redux更新了我的代码action@ShubhamKhatri请检查我的更新代码,当我跟随您的第一个代码片段并执行以下操作时
export const LoggedIn=(isLoggedIn)=>{return function(dispatch){return new Promise((拒绝,解析)=>{dispatch({type:USER_LOGGED_IN,payload:isLoggedIn})resolve();}}}
它抛出未捕获(承诺中)另外,Shubham,你能解释一下为什么我需要在行动中使用promise吗?你正在使用a。然后在你的代码中,因此你需要返回aPromise@KuchBhi,我在参数顺序中犯了一个小错误,请检查更新的代码是否
dispatch
已返回承诺?如果是,请避免!至少使用
Promise.resolve()
而不是
newpromise
。当我按照您的第一个代码片段执行类似操作时,
export const LoggedIn=(isLoggedIn)=>{return function(dispatch){return new Promise((拒绝,解析)=>{dispatch({type:USER_LOGGED_IN,payload:isLoggedIn})resolve();}}}
它抛出未捕获(承诺中)另外,Shubham,你能解释一下为什么我需要在行动中使用promise吗?你正在使用a。然后在你的代码中,因此你需要返回aPromise@KuchBhi,我在参数顺序中犯了一个小错误,请检查更新的代码是否
dispatch
已返回承诺?如果是,请避免!至少使用
Promise.resolve()
而不是
new Promise
。我是否需要在我的redux操作中也包含Shubham Khatri所做的承诺?另外,请您解释一下我们如何在这里
this.props.LoggedIn(false)解析我们在redux操作中所做的承诺。然后(()=>{this.props.history.replace('/signup'));return Promise.resolve();//Just return a resolved Promise})
我是否需要将Shubham Khatri所做的承诺也包括在我的redux操作中?另外,请您解释一下我们如何在这里解析我们在redux操作中所做的承诺
this.props.LoggedIn(false)。然后(()=>{this.props.history.replace('/signup'));return Promise.resolve();//只需返回已解析的承诺})