Асинхронные функции возвращают Объект Promise , который в конечном итоге будет разрешен возвращаемым значением, указанным при выполнении тела функции - либо путем выполнения оператора возврата, либо путем выполнения последнего оператора в теле и возврата undefined
.
Асинхронные функции не ожидают завершения асинхронных операций внутри функции async
.Это делается для того, чтобы код, вызывающий асинхронную функцию, мог завершиться и вернуться к циклу событий, что позволяет продолжить выполнение любых ожидающих или вновь инициированных асинхронных операций.
Оператор await
вызывает then
для своего обещания операнда,сохраняет контекст выполнения функции, возвращает диспетчер задач, вызывает метод get с помощью предоставленных ей обработчиков then
, восстанавливает сохраненный контекст выполнения и возвращает выполненное значение ее операнда в результате операции await
.Из-за использования then
обратного вызова операции await
никогда не оцениваются синхронно.
Итак,
var port = get_port();
возвращает обещание, которое должно быть разрешено с портомчисло.Если он не вызывается в асинхронной функции, используйте обработчик then
для выбора номера порта:
var port = get_port();
port.then( port=> server.listen(port));
В опубликованном коде показан антипаттерн создания обещания, которое всегда разрешается илиотклонено другим обещанием - просто верните другое обещание - и если вы всегда возвращаете обещание из функции
async
без использования
await
, это не обязательно должно быть функцией
async
, во-первых.