在Javascript中,异步等待所有嵌套函数完成吗?

时间:2018-10-10 16:04:52

标签: javascript reactjs async-await es6-promise

在下面的示例中,我需要在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();
};

谢谢:)

2 个答案:

答案 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();
};

是存档所需行为的一种正确方法。