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 | }
答案 0 :(得分:2)
来自https://reactjs.org/docs/
所以我认为这可以解决你的问题
this.setState({token : this.Auth.getToken()} , async () => {
await service.logout(this.state.token)
await this.Auth.logout()
});

答案 1 :(得分:1)
首先,不要使用componentWillMount代替 的 componentDidMount 即可。 componentWillMount将弃用 react17 强>
setState不返回promise,而是可以使用回调函数 将在状态设定后执行。
- 的帮助下做出承诺
在下面的示例中,我在回调函数中调用logout函数,返回a 诺言。在那里你可以使用.then(),因为该函数返回一个 在 异步等待
- 醇>
您还可以使用 async 语法将回调函数定向到异步回调函数。
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()))