代码之家  ›  专栏  ›  技术社区  ›  Alwaysblue

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

  •  0
  • Alwaysblue  · 技术社区  · 7 年前

    我试图在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) 是一个还原动作。

    这是一个错误

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

    这是我的还原动作

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

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

    4 回复  |  直到 7 年前
        1
  •  0
  •   Shubham Khatri    7 年前

    你的减缩行动没有兑现承诺。或者你可以创建并返回一个新的承诺

    export const LoggedIn  = (isLoggedIn) => {
      return function (dispatch) {
        return new Promise((resolve, reject) => {
             dispatch({
                 type: USER_LOGGED_IN ,
                 payload: isLoggedIn
             })
             resolve();
        })
      }
    }
    

    或者执行,history.replace,从redux操作本身中进行替换

    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);
    }
    
        2
  •  1
  •   Prasun    7 年前

    按照 redux-thunk 医生,你应该回去 Promise 从你的内部功能来使用 .then 在行动中。

    来自内部函数的任何返回值都将可用作调度本身的返回值。这便于协调一个异步控制流与thunk动作创建者相互调度,并返回等待对方完成的承诺:

    看一下文件 here .

    可能的代码已由共享 Shubham Khatri

        3
  •  1
  •   lumio    7 年前

    你需要回报一个承诺。

    因此,改为这样做:

    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
      })
    }
    
        4
  •  0
  •   Raj Kumar N    7 年前

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

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

    componentDidUpdate() {
      if (condition) {
         this.props.history.replace('/signup');
      }
    }
    

    https://reactjs.org/docs/react-component.html#componentdidupdate