$ cat x.js
async function print() {
console.info("abc");
}
print();
$ nodejs x.js
abc
Как это может быть?! print() возвращает неожидаемый объект Promise, не так ли? Если его не ждут, то почему выполняется console.info?
Отвечает ли это на ваш вопрос? stackoverflow.com/questions/47227550/…
@choz Странно то, что abc действительно печатается.
@PraveenKumarPurushothaman Это не так.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


да, как сказал Чоз, асинхронные функции возвращают обещание, даже если вы не определили обещание в своем коде.
я думаю, что это возвращенное обещание становится выполненным после того, как все обещания в операторе ожидания будут разрешены.
я тестирую его в следующем коде, он также возвращает обещание, которое выполняется только после того, как все обещания будут разрешены (в этом случае через 3000 мс):
async function print2() {
await console.info("abc")
await new Promise((res, rej) => {
setTimeout(() => {res(33)},3000)
})
await new Promise((res, rej) => {
setTimeout(() => {res(33)},50)
})
}
«это возвращенное обещание становится выполненным после того, как все обещания в операторе ожидания будут разрешены» - но оператора ожидания нет!
извините, мое заявление было неясным, я имею в виду, что в асинхронных функциях возвращенное обещание разрешается после того, как все обещания в функции разрешаются (включая обещания, объявленные с помощью ключевого слова ожидания, вы знаете, что await 3 работает как Promise.of(3)). хотя я не очень четко видно связь между возвращенным обещанием и другими обещаниями в приведенном выше заявлении.
Можно сказать, что сама пустая функция возвращает undefined (что на самом деле ничего не возвращает). Взгляните на образец ниже;
function print() {}
var returnVal = print(); // undefined
Вы заметите, что returnVal это undefined.
Теперь, если у нас есть что-то в body из test(), но вы по-прежнему не передаете никакого возвращаемого значения, то returnVal все равно будет undefined.
function print() {
console.info('abc');
}
var returnVal = print(); // undefined
Итак, чтобы функция имела возвращаемое значение, ее просто нужно return.
function print() {
console.info('abc');
return 1;
}
var returnVal = print(); // 1
Когда вы конвертируете его в асинхронную функцию. Цитата из MDN
Тело асинхронной функции можно рассматривать как разделенное на ноль. или несколько выражений ожидания. Код верхнего уровня, включая первое выражение ожидания (если оно есть) запускается синхронно. В таким образом будет выполняться асинхронная функция без выражения ожидания синхронно. Если внутри функции есть выражение ожидания body, однако асинхронная функция всегда будет выполняться асинхронно.
Код после каждого выражения await можно рассматривать как существующий в .затем обратный вызов. Таким образом, цепочка обещаний постепенно строится с каждым реентерабельным шагом через функцию. Возврат стоимость образует последнее звено в цепи.
Теперь, основываясь на приведенной выше информации, вот что мы знаем о вашем вопросе;
print() ничего не возвращает, как и должно быть undefinedИтак, чтобы сказать это в вашем вопросе, вот что на самом деле делает ваша функция;
async function print() {
console.info("abc"); // Prints 'abc'
}
// Function above is equivalent to;
function printEquivalentInNonAsync() {
console.info("abc"); // Prints 'abc'
}
var returnVal = print(); // `returnVal` is `undefined`
И, чтобы ответить на ваш вопрос
Если его не ждут, то почему выполняется console.info?
Независимо от того, ожидается ли асинхронная функция, она все равно выполняется! - Ждет только того, чтобы убедиться, что выполнение строки остановлено до тех пор, пока асинхронная функция (Promise) не будет выполнена или отклонена. Обратите внимание, что первое состояние Promise — ожидание.
Когда выполняется неожидаемая асинхронная функция? Что, если у меня есть f() без await, где f — асинхронная функция в функции синхронизации?
Если вы используете await для вызова своей асинхронной функции, она вернет разрешенное значение вместо обещания, которое в вашем случае undefined. Если вы не используете await так, как сейчас, то оно вернется Promise<undefined>
Ну, он должен был напечатать ваш
console.info, так как вы его выполнили, а затем вернуть объектPromise, который должен иметьfulfilledвundefined. Как это странно?