В Javascript async ждет ожидания завершения всех вложенных функций? - PullRequest
0 голосов
/ 10 октября 2018

В приведенном ниже примере мне нужно сбросить некоторые значения перед выполнением вызова fetchData в методе fetch.Ожидает ли асинхронное ожидание завершения всех функций в методе сброса, прежде чем продолжить?

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 голосов
/ 10 октября 2018

async / await не имеет магического отношения к асинхронной функции.Это дополнение к синтаксису, которое позволяет вам легче работать с обещаниями.

Так что, когда функция возвращает обещание, вам нужно явно его дождаться.

Либо, написав 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()
  ])
};

Если вы не дожидаетесь Обещаний, как в первом примере:

reset = () => {
  this.props.resetFilter();
  this.props.resetClient();
  this.props.resetUser();
};

, тогда цепочка обещаний прерывается для этих трех вызовов, поначалу это может не выглядеть проблемой, особенноесли вы предполагаете, что они всегда решают.Но может привести к необоснованному отклонению, если одно из этих обещаний будет отклонено.

0 голосов
/ 10 октября 2018

Эта функция возвращает неопределенное значение, не дожидаясь завершения всех вызовов функции.

reset = () => {
  this.props.resetFilter();
  this.props.resetClient();
  this.props.resetUser();
};

Если вы хотите убедиться, что значение возвращается только в том случае, если все вызовы выполнены, вам нужно дождаться (или цепочка обещаний, или ...)

Таким образом

reset = async () => {
  await this.props.resetFilter();
  await this.props.resetClient();
  await this.props.resetUser();
};

- это один из правильных способов архивирования желаемого поведения.

...