Почему будущие работы после выполнения основной функции были выполнены?

#asynchronous #dart

#асинхронный #дротик #dart

Вопрос:

В примере на dart.dev будущее печатает сообщение после выполнения основной функции.

Почему будущее может сработать после того, как основная функция будет выполнена? На первый взгляд, после завершения основной функции ожидается, что вся работа программы будет завершена (и будущее должно быть отменено).

Пример кода:

 Future<void> fetchUserOrder() {
  // Imagine that this function is fetching user info from another service or database.
  return Future.delayed(Duration(seconds: 2), () => print('Large Latte'));
}

void main() {
  fetchUserOrder();
  print('Fetching user order...');
}
  

Программа печатает

 Fetching user order...
Large Latte
  

Я ожидал только следующего

 Fetching user order...
  

Комментарии:

1. Потому что присутствие Future поддерживает цикл событий? Разве не в этом суть?

2. Я не знаю, объясняется ли это где-либо явно, но в старой статье с веб-сайта Dart обсуждается это: «Когда main() выполнение завершено, асинхронные функции могут возобновить выполнение …»

3. Если вы действительно хотите выйти из программы, я думаю, вам следует использовать exit(0) from dart:io , который не будет ждать завершения какого-либо future и просто выйти

Ответ №1:

Это связано с природой фьючерсов и асинхронного программирования. За кулисами Dart управляет чем-то, называемым асинхронной очередью. Когда вы запускаете future (либо вручную, как вы делали с помощью Future.delayed , либо неявно, вызывая метод с пометкой async , выполнение этой функции переходит в очередь всякий раз, когда ее выполнение откладывается. Каждый цикл, когда основной поток Dart простаивает, он проверяет фьючерсы в очереди, чтобы увидеть, не заблокирован ли какой-либо из них, и если да, то возобновляет их выполнение.

Программа Dart не завершится, пока futures находятся в очереди. Он будет ждать, пока все они либо завершатся, либо выдадут ошибку.