时间:2018-05-03 06:41:59

标签: javascript reactjs react-native react-redux

setState之后,我想拨打service.logout(),然后Auth.logout()功能,

 componentWillMount() {
    if (!(this.Auth.loggedIn())){
      this.props.history.replace('/login');
    } else {
      this.setState({token : this.Auth.getToken()}).then(service.logout(this.state.token)).then( this.Auth.logout())
      // console.log('token',this.state.token)

    }
  }

但我得到error这样的话,

 TypeError: Cannot read property 'then' of undefined
Logout.componentWillMount
src/components/auth/Logout.js:20
  17 | if (!(this.Auth.loggedIn())){
  18 |   this.props.history.replace('/login');
  19 | } else {
> 20 |   this.setState({token : this.Auth.getToken()}).then(service.logout(this.state.token)).then( this.Auth.logout())
  21 |   // console.log('token',this.state.token)
  22 |  
  23 | }

4 个答案:

答案 0 :(得分:2)

来自https://reactjs.org/docs/

enter image description here

所以我认为这可以解决你的问题



      this.setState({token : this.Auth.getToken()} , async () => {
       await service.logout(this.state.token) 
       await this.Auth.logout()
      });
      
      
      




答案 1 :(得分:1)

  
      
  1. 首先,不要使用componentWillMount代替   的 componentDidMount 即可。 componentWillMount将弃用   react17

  2.   
  3. setState不返回promise,而是可以使用回调函数   将在状态设定后执行。

  4.   
  5. 在下面的示例中,我在回调函数中调用logout函数,返回a   诺言。在那里你可以使用.then(),因为该函数返回一个   在 异步等待

  6. 的帮助下做出承诺   
  7. 您还可以使用 async 语法将回调函数定向到异步回调函数。

  8.   
  componentDidMount() {
    if (false){
      this.props.history.replace('/login');
    } else {
      this.setState({token : 'one'}, () => {
        this.logout(this.state.token).then(() => {
          // Do whatever you want
          console.log('three');
        });
      });
    }
  }

 logout = async (token) => {
     const a = new Promise((resolve, reject) => {
          setTimeout(() => { console.log('two'); return resolve("done!"); }, 1000)
     });

     return await a;
  }

查看工作示例click here

答案 2 :(得分:1)

this.setState不返回“Promise”,这就是使用“then”方法链接操作的原因。 ref.

如果你的“service.logout(..)”返回Promise,那么可能跟随一个将起作用。

componentWillMount() {
if (!(this.Auth.loggedIn())){
  this.props.history.replace('/login');
} else {
  const authToken = this.Auth.getToken();
  this.setState({token : authToken }, () => { 
       service.logout(authToken).then( this.Auth.logout());
  });
}

}

答案 3 :(得分:-1)

对不起,我不知道反应,但我知道Angular。 如果service.logout()返回一个Observable,那么你不应该将.then()方法与它绑定返回值,就像这样吗?

this.setState({token : this.Auth.getToken()}).then(service.logout(this.state.token).then( this.Auth.logout()))