Требуется ли асинхронное ожидание разрешения Promise для вызова .then ()? - PullRequest
2 голосов
/ 20 июня 2019

Допустим, у меня есть следующая асинхронная функция.console.log будет срабатывать только после разрешения.

(async () => {
  await new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
  console.log('resolved');
})();

Это допустимый JavaScript?Или я всегда должен использовать .then()?Каковы недостатки или поведенческие отличия от использования .then() здесь?

(async () => {
  return await new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
})().then(() => {
  console.log('resolved');
});

Не по теме: я также заметил, что последний метод return await можно изменить на return без изменения результатов, но в этой теме ответил на этот вопрос.

1 Ответ

3 голосов
/ 20 июня 2019

Способность обрабатывать асинхронные операции, не всегда прибегая к then, является основной идеей async/await.Первый пример совершенно верен.

Второй пример немного антипаттерн, так как он был бы функционально идентичен без async/await по двум причинам - если вы пометите вашу функцию с помощью async, то неявно заставит ее вернуть Обещание, но вы также явно возвращаете единицу - и await, так как Обещание заставляет код ждать, пока Обещание не разрешится, прежде чем его вернуть, но, так как вы соединяетесь с then, then не запускается до разрешения Обещанияв любом случае.

Это было бы функционально идентично:

(() => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
})().then(() => {
  console.log('resolved');
});

Основным недостатком использования "синхронного" кода, как в первом примере, является обработка ошибок - если вы выполняете 5 await операцийподряд, и любой из них отклоняется, вся ваша функция async возвращает отклоненное обещание.Если вы объединяете в цепочку операции then, вы также можете вставить обработчики catch для более точной обработки определенных случаев ошибок.

...