在下面的示例中,我需要在fetch方法中调用fetchData之前重置一些值。异步是否会等待reset方法中的所有功能完成才能继续?
fetch = async () => {
await this.reset();
this.props.fetchData();
};
reset = () => {
this.props.resetFilter();
this.props.resetClient();
this.props.resetUser();
};
还是您必须执行以下操作?
fetch = () => {
this.reset().then(() => {
this.props.fetchData();
});
};
reset = async () => {
await this.props.resetFilter();
await this.props.resetClient();
await this.props.resetUser();
};
谢谢:)
答案 0 :(得分:4)
async
/ await
不能神奇地处理异步功能。
这是一种语法附加功能,使您可以更轻松地处理Promise。
因此,只要函数返回Promise,就需要显式等待它。
如果要按顺序执行它们,可以在每个字符前面加上await
,如第二个示例所示:
reset = async () => {
await this.props.resetFilter();
await this.props.resetClient();
await this.props.resetUser();
};
或者,如果您想允许那些异步函数插入Promise.all
:
reset = async () => {
await Promise.all([
this.props.resetFilter(),
this.props.resetClient(),
this.props.resetUser()
])
};
如果您不像第一个示例那样等待Promises:
reset = () => {
this.props.resetFilter();
this.props.resetClient();
this.props.resetUser();
};
然后,对于这三个调用,promise链断开了,一开始看起来似乎不是问题,特别是如果您假设它们总是可以解决的话。但是,如果其中一项承诺被拒绝,则会导致无法处理的拒绝。
答案 1 :(得分:1)
此函数返回未定义状态,而无需等待所有函数调用被解决。
reset = () => {
this.props.resetFilter();
this.props.resetClient();
this.props.resetUser();
};
如果要确保仅在所有呼叫都解决后才返回值,则需要等待(或链式承诺或...)
因此
reset = async () => {
await this.props.resetFilter();
await this.props.resetClient();
await this.props.resetUser();
};
是存档所需行为的一种正确方法。