componentDidMount()
在React Native中用作异步函数是一种好习惯还是应该避免呢?
我需要从AsyncStorage
安装组件时获取一些信息,但是我知道使之成为可能的唯一方法是使componentDidMount()
函数异步。
async componentDidMount() {
let auth = await this.getAuth();
if (auth)
this.checkAuth(auth);
}
这有什么问题吗,还有其他解决方案吗?
让我们首先指出差异并确定差异可能如何引起麻烦。
这是异步和“同步” componentDidMount()
生命周期方法的代码:
// This is typescript code
componentDidMount(): void { /* do something */ }
async componentDidMount(): Promise<void> {
/* do something */
/* You can use "await" here */
}
通过查看代码,我可以指出以下差异:
async
关键字:在打字稿,这仅仅是一个代码标记。它做两件事:
Promise<void>
改为void
。如果您明确指定返回类型为非承诺(例如:void),则打字稿将向您吐一个错误。await
在方法内部使用关键字。返回类型从更改void
为Promise<void>
async someMethod(): Promise<void> { await componentDidMount(); }
现在,您可以await
在方法内部使用关键字,并暂时暂停其执行。像这样:
async componentDidMount(): Promise<void> {
const users = await axios.get<string>("http://localhost:9001/users");
const questions = await axios.get<string>("http://localhost:9001/questions");
// Sleep for 10 seconds
await new Promise(resolve => { setTimeout(resolve, 10000); });
// This line of code will be executed after 10+ seconds
this.setState({users, questions});
return Promise.resolve();
}
现在,它们怎么会引起麻烦?
async
关键字是绝对无害的。componentDidMount()
方法,因此返回类型Promise<void>
也是无害的。调用到具有方法的返回类型的Promise<void>
无await
关键字将没有从调用具有返回类型的一个区别void
。
componentDidMount()
延迟执行似乎很安全。但是有一个陷阱。假设上述操作this.setState({users, questions});
将在10秒后执行。在延迟的时间中间,另一个…
this.setState({users: newerUsers, questions: newerQuestions});
…已成功执行,并且DOM已更新。结果对用户可见。时钟继续滴答作响,经过了10秒钟。this.setState(...)
然后,将执行延迟的操作,然后再次使用旧用户和旧问题更新DOM。结果也将对用户可见。
= > async
与componentDidMount()
method
一起使用非常安全(我不确定大约100%)。我非常喜欢它,到目前为止,我还没有遇到任何让我头疼的问题。
我的render函数中的return中有一个按钮,它调用了一个函数,该函数启动了一个promise链,结果更新了一个状态变量。但是,不传递该值。 我在componentDidMount()上尝试了一些尝试,但没有任何运气 这是我的渲染函数中的按钮 应给出类似的内容。但是,我得到的却是。
我正在阅读react lifecycle,有点困惑。有些人建议使用componentWillMount进行ajax调用: https://hashnode.com/post/why-is-it-a-bad-idea-to-call-setstate-immediately-after-componentdidmount-in-react-cim5vz8kn01flek53aqa22mby 在com
问题内容: 我正在阅读反应生命周期,并感到有些困惑。一些建议使用componentWillMount进行ajax调用: https://hashnode.com/post/why-is-it-a-bad-idea-to-call-setstate-immediately- after-componentdidmount-in-react- cim5vz8kn01flek53aqa22mby 在co
我正面临着一个问题,即设计能够执行网络I/O的方法(用于可重用库)。我读过这个问题 API设计中C#5Await/Async模式 以及其他与我的问题更接近的问题。 所以,问题是,如果我想同时提供异步和非异步方法,我必须如何设计这些? 例如,要公开方法的非异步版本,我需要执行如下操作 我觉得这不是个好设计。我想要一个关于如何定义私有方法的建议(例如),这些私有方法可以包装在公共方法中以提供两个版本。
问题内容: 我有调度动作的功能。我想在操作之前和之后显示一个加载程序。我知道将对象传递给时会做出反应。问题是如何以异步方式更新属性: 基本上,如果我将此属性作为应用程序状态的一部分(使用Redux),那么一切都很好,但是我真的更喜欢将此属性仅带到组件状态。 问题答案: 将其余代码包装在第一个的回调中: 有了这个,你可以保证被设定为之前被调用,并且被设置回。 这假设您的功能是同步的。如果不是,则将其
所以我理解为什么从异步返回空洞通常没有意义,但我遇到了一种我认为完全有效的情况。请考虑以下人为的示例: 我意识到这是一个不寻常的例子,但我试图使其简单化和更普遍化。有人能向我解释为什么这是可怕的代码,以及我如何修改它以正确遵循约定吗? 谢谢你的任何帮助。