Можно ли вызвать асинхронную функцию без ключевого слова await? и что будет, если мы позвоним без ожидания? - PullRequest
4 голосов
/ 06 марта 2019

Я хотел бы сделать следующее и иметь в виду, что на самом деле это работает для меня.у меня вопрос, что происходит и можно ли вызвать async usrs() func из non async componentDidMount() func?если это невозможно, почему это работает для меня, позвонив this.usrs(usrs) вместо await this.usrs(usrs);

let outState = {};
class A extends Component{
  componentDidMount(){
   this.usrs(usrs);
  }
  getData(usr){
    return db.collection('a/'+usr+'/bb').get().then(snap=>{
      for(i = snap.docs.length-1; i>=0; i--){
         outState[usr] = [...outState[usr], snap.docs[i].data()];
         if(i === 0) return outState;
      }
     return false;
    });
  }

  async usrs(usrs){

   let os = {}, data = {};

    for(i = usrs.length-1; i>=0; i--){

       os = await this.getData(usrs[i]);
       if(os){
          data = { ...data, ...os };
          if (i === 0) {
             this.setState({ ...this.state, ...data });
          }
       }

    }

  }

}

Ответы [ 4 ]

5 голосов
/ 06 марта 2019

Вам нужно только await, если вызывающему абоненту нужно дождаться выполнения функции, например, когда ему нужен результат функции или когда ему нужно дождаться некоторого изменения состояния / данных, вызванного функцией.Если такой зависимости нет, вы можете просто «запустить и забыть», не используя ключевое слово await.

. Как уже упоминалось, вы также можете использовать .then, но основным правилом являетсяТо же самое: вы делаете это, когда у вас есть что-то конкретное, что нужно сделать после выполнения функции.В противном случае его можно опустить.

Конкретно: под «вызывающим» я имею в виду функцию, которая вызывает асинхронную функцию.В вашем случае это будет componentDidMount.Опции тогда довольно просты:

  1. Сохранить как есть.usrs() будет работать в фоновом режиме полностью, а componentDidMount будет продолжаться до конца.
  2. Используйте await, поэтому componentDidMount будет ожидать возврата usrs().
  3. Используйте usrs().then(), чтобы componentDidMount можно было продолжить, но код, указанный в .then(), вызывается после возврата usrs(), если вам нужно сделать что-то, что должно произойти после выполнения usrs().
3 голосов
/ 06 марта 2019

Вы можете вызвать асинхронную функцию из любого места. Асинхронная функция возвращает обещание , поэтому, если вы вызываете его, как показано ниже, вы можете использовать его, как если бы это было обещание.

async function example(){
  return 10;
}
const returnOfAsync = example()
console.log(returnOfAsync instanceof Promise) // true
returnOfAsync.then((theReturn) => {
  console.log(theReturn) // 10
})
3 голосов
/ 06 марта 2019

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

await заставляет JavaScript ждать, пока обещание не будет выполнено, и останавливается, когда вам нужно поработать над результатом этого обещания.

Чтобы понять это лучше, я рекомендую увидеть следующую страницу https://javascript.info/async-await

1 голос
/ 06 марта 2019

Мы используем await, когда нам нужно вызвать и ждать функцию async или Promise
В вашем случае, когда вы вызываете ее без await внутри вашего componentDidMount, ваша функция будет работать, но вашаcomponentDidMount не будет ждать полного завершения этой функции.
Также, если вы не хотите использовать await и не хотите ждать внутри componentDidMount, но хотите получать уведомление, когда ваш *Функция 1011 * завершена, вместо нее можно использовать .then.Потому что async функции возвращает Promise

Вот ваш componentDidMount с .then.Обратите внимание, что в этом примере this.doSomethingElse будет вызывать до завершения this.usrs, и вы будете только внутри .then получать уведомление о вашем this.usrs результате:

componentDidMount(){
    this.usrs(usrs).then(() => {
        // Your functions completely finished
    })
    .catch(err => {
        // There was an error
    });

    this.doSomethingElse();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...