Какое значение вернет асинхронная функция без return?

Ответ

В JavaScript (и, соответственно, в Node.js) асинхронная функция (async function) всегда возвращает Promise. Если в такой функции нет оператора return, она неявно возвращает undefined, и Promise разрешится именно с этим значением.

Пример:

async function fetchDataAndLog() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  console.log(data);
  // Нет оператора return
}

const resultPromise = fetchDataAndLog(); // resultPromise — это Promise

resultPromise.then((value) => {
  console.log('Результат промиса:', value); // Выведет: Результат промиса: undefined
});

Почему так происходит? Ключевое слово async заставляет функцию возвращать Promise. Тело функции выполняется, и если интерпретатор не встречает return, он действует по стандартному правилу: функция завершается, возвращая undefined. Это undefined автоматически оборачивается в успешно выполненный Promise (Promise.resolve(undefined)).

Это важно учитывать при цепочке вызовов или при использовании async функций в качестве обработчиков, где может ожидаться конкретное значение.

Ответ 18+ 🔞

Э, слушай, тут один нюанс в JavaScript такой, что просто ёперный театр. Запомни раз и навсегда: если ты объявляешь функцию как async, то она, сука, всегда возвращает Promise. Всегда, блядь. Даже если ты в ней нихуя не возвращаешь.

Смотри, как это работает:

async function fetchDataAndLog() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  console.log(data);
  // Нет оператора return
}

const resultPromise = fetchDataAndLog(); // resultPromise — это Promise

resultPromise.then((value) => {
  console.log('Результат промиса:', value); // Выведет: Результат промиса: undefined
});

Видишь? Функция отработала, данные в консоль выплюнула, а вернула-то что? undefined. Потому что return забыл, как последние штаны. И этот undefined аккуратненько заворачивается в успешно выполненный промис, типа Promise.resolve(undefined).

А почему так, спросишь? Да всё просто, как яичница. Ключевое слово async — это такой волшебный пинок для интерпретатора. Оно говорит: "Э, сабака сука, эта функция теперь асинхронная, и что бы она ни делала, на выходе ты получишь промис". И если в коде нет явного return, движок просто пожимает плечами и возвращает undefined, завёрнутый в промис. Доверия к такому коду — ебать ноль, но правила есть правила.

Это, кстати, частая причина, когда потом в цепочке вызовов начинается пиздец. Ожидаешь ты какого-то значения, а тебе прилетает undefined, и ты сидишь такой: "Ни хуя себе, а где мой результат?". А его нет, он сбежал. Так что, чувак, если используешь async функцию как обработчик и тебе нужно что-то передать дальше — не забудь этот самый return, а то будет тебе хиросима, а не работающий код.