在 React Native 中使用 componentDidMount()
作为异步函数的良好做法还是应该避免使用它?
当组件安装时,我需要从 AsyncStorage
获取一些信息,但我知道使这成为可能的唯一方法是使 componentDidMount()
函数异步。
async componentDidMount() {
let auth = await this.getAuth();
if (auth)
this.checkAuth(auth);
}
这有什么问题吗?还有其他解决方案吗?
原文由 Mirakurun 发布,翻译遵循 CC BY-SA 4.0 许可协议
让我们首先指出差异并确定它如何导致麻烦。
这是async和“sync”的代码
componentDidMount()
生命周期方法:通过查看代码,我可以指出以下差异:
async
关键字:在打字稿中,这只是一个代码标记。它做了两件事:Promise<void>
而不是void
。如果您明确指定返回类型为非承诺(例如:void),打字稿将向您吐出一个错误。await
关键字。返回类型从
void
更改为Promise<void>
async someMethod(): Promise<void> { await componentDidMount(); }
您现在可以在方法中使用
await
关键字并暂时暂停其执行。像这样:现在,他们怎么可能惹麻烦?
async
关键字绝对无害。componentDidMount()
方法,因此返回类型Promise<void>
也是无害的。调用返回类型为
Promise<void>
的方法没有await
关键字与调用返回类型为void
的方法没有区别。componentDidMount()
之后没有生命周期方法,因此延迟其执行似乎很安全。但是有一个问题。假设上面的
this.setState({users, questions});
将在 10 秒后执行。在延迟时间的中间,另一个……this.setState({users: newerUsers, questions: newerQuestions});
=> 使用
async
和componentDidMount()
方法非常安全(我不确定 100%)。我是它的忠实粉丝,到目前为止,我还没有遇到任何让我头疼的问题。