Способность обрабатывать асинхронные операции, не всегда прибегая к 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
для более точной обработки определенных случаев ошибок.