Что возвращает асинхронная функция в Dart?

Ответ

Асинхронная функция, помеченная ключевым словом async, всегда возвращает объект типа Future<T>. T — это тип реального значения, которое будет вычислено в будущем.

  • Если функция возвращает String, то ее сигнатура будет Future<String>.
  • Если функция не возвращает явного значения (void), то сигнатура — Future<void>.

Пример:

Future<int> fetchUserId() async {
  await Future.delayed(Duration(seconds: 1)); // Имитация асинхронной операции
  return 42; // Значение 42 будет обернуто в Future<int>
}

Future<void> logMessage(String message) async {
  print(message);
  // Неявно возвращается Future<void>
}

void main() async {
  // Обработка через await
  final int id = await fetchUserId();

  // Обработка через then/catchError
  fetchUserId().then((id) {
    print('User ID: $id');
  }).catchError((error) {
    print('Ошибка: $error');
  });
}

Ключевые моменты:

  1. Future — это контейнер для отложенного результата (успешного значения или ошибки).
  2. Ключевое слово async позволяет использовать await внутри функции и автоматически оборачивает возвращаемое значение в Future.
  3. Для работы с Future используются await (внутри async-функций) или методы then(), catchError(), whenComplete().

Ответ 18+ 🔞

Э, слушай, вот тебе история про эти ваши async функции в Dart. Ситуация, блядь, как с пиццей, которую заказал, а она ещё едет. Ты точно знаешь, что будет пицца, но пока у тебя на руках только квитанция — вот это и есть Future<T>. T — это тип самой пиццы, String там или int.

Вот смотри, объявляешь ты функцию с этим async — и всё, ёпта, она уже не возвращает просто String. Она возвращает обещание, что когда-нибудь тебе дадут эту строку. Получается Future<String>. Если функция просто делает дело и ничего не отдаёт (void), то она возвращает Future<void> — типа, обещание, что дело когда-то сделается, и всё.

Смотри, как это выглядит:

Future<int> fetchUserId() async {
  await Future.delayed(Duration(seconds: 1)); // Прикинь, типа ждём курьера секунду
  return 42; // А вот и пицца... то есть, юзер айди! Но обёрнутое в Future<int>
}

Future<void> logMessage(String message) async {
  print(message);
  // Тут Future<void> вернётся само, даже писать не надо
}

void main() async {
  // Вариант для терпеливых: сиди и жди (await)
  final int id = await fetchUserId(); // Сидишь, бздишь, пока не привезут

  // Вариант для похуистов: скажи, что сделать, когда привезут (then/catchError)
  fetchUserId().then((id) {
    print('User ID: $id'); // О, приехало! Распаковывай.
  }).catchError((error) {
    print('Ошибка: $error'); // Ага, курьер с пиццей улетел в кювет. Пиздец.
  });
}

Короче, суть, чтобы ты запомнил:

  1. Future — это не значение, а бумажка, что значение будет. Контейнер, блядь, для того, что ещё в пути (или для ошибки, если всё накрылось медным тазом).
  2. Волшебное слово async делает две вещи: разрешает внутри использовать await и автоматически, ёб твою мать, заворачивает твой return в этот самый Future. Самому париться не надо.
  3. Работать с этой хуйнёй можно двумя способами: либо сидеть и трястись в ожидании с await (только внутри других async-функций), либо отдать инструкции — then() (когда приедет), catchError() (если всё просрётся) и whenComplete() (когда вообще всё уже кончится, неважно как). Выбирай, что тебе ближе по характеру.