Порядок выполнения async-await и then
Использую express для запуска сервера и подключаю mongodb с помощью mongoose. Согласно документации mongoose можно подключить двумя способами:
1 способ:
console.log("Start app");
mongoose.connect('mongodb://127.0.0.1:27017/test')
.then(() => console.log('Connected to mongodb.'))
.catch(error => handleError(error));
const app = express();
app.listen(3000, () => {
console.log("Server started on port 3000. Url: http://localhost:3000!");
});
В этом случае консоль выдаст, что сначала запускается сервер, а потом происходит подключение к mongodb:
Start app
Server started on port 3000. Url: http://localhost:3000!
Connected to mongodb.
2 способ:
console.log("Start app");
try {
await mongoose.connect('mongodb://127.0.0.1:27017/test');
console.log('Connected to mongodb.');
} catch (error) {
handleError(error);
}
const app = express();
app.listen(3000, () => {
console.log("Server started on port 3000. Url: http://localhost:3000!");
});
А в этом сначала будет подключение к бд, а потом запуск сервера.
Start app
Connected to mongodb.
Server started on port 3000. Url: http://localhost:3000!
Пытаюсь понять принципиальную разницу между async-await и .then и вроде бы везде пишут, что async-await служит лишь обёрткой, а внутри тоже самое, что и у .then, но судя по выводу консоли последовательность выполнения в приложении разная. Помогите разобраться, почему так происходит?
Ответы (1 шт):
Суть у этих конструкций примерно одна: дождаться результата и потом что-то...
Однако await заставит интерпретатор JavaScript ждать до тех пор, пока промис справа от await не выполнится. Только после этого вернёт его результат, и выполнение кода продолжится. Т.е., упрощённо, код вниз не пойдёт, пока не закончится действие. Даже если придётся 100 лет ждать.
В случае с then такого нет. Он не останавливает выполнение кода, расположенного ниже. Он всего лишь гарантирует выполнение какого-то действия после того, как промис выполнится.