Почему тот же объект (dbElement), содержащий строку при регистрации ее внутри функции ('перед возвратом: ...') и содержащий обещание при возврате через возврат функции
Каждая функция async
возвращает Promise
для своего возвращаемого значения.Поэтому, когда вы возвращаете обычное значение из асинхронной функции - вы получаете обещание для этого значения.
Вполне нормально (пока мы не получим стабильно ожидаемый верхний уровень), чтобы обернуть ваш "основной" код во IIFE (выражение вызова, вызываемого сразу), и использовать там ожидание:
(async () => { // can use await here
console.log("returned: " + await getSynchronous());
})();
Почему возвращаемый объект записывается в консоль до того, как объект внутри функции будет?
Обещание это значение + время, модель выполнения JavaScript состоит в том, что синхронный код всегда запускается от начала до концаи вы можете «зарегистрировать» только те вещи, которые будут запущены платформой позднее.Таким образом, в этом случае getSynchronous
возвращается синхронно, но ожидание происходит после того, как весь синхронный код выполнен.
Хотя в этом коде нет ничего асинхронного - всякий раз, когда вы await
что-то, другой синхронный код получает шанс запустить первымтак что если вы измените реализацию того, что вы ожидаете, чтобы быть действительно асинхронным или чем-то асинхронным, вы не получите неприятного состояния гонки в вашем порядке выполнения.Это также верно для способа выполнения обратных вызовов Promise
then
.