void f()
и Future<void> f()
не идентичны.(Наличие ключевого слова async
на самом деле не имеет значения. Ключевое слово async
в основном позволяет использовать ключевое слово await
в теле функции.)
void f()
объявляет функцию, которая возвращаетничего такого.Если он выполняет асинхронную работу, то эта работа будет «запущена и забыта»: у вызывающего пользователя f
нет возможности дождаться его завершения.
Напротив, Future<void> f()
объявляетфункция, которая возвращает Future
, которого может ожидать вызывающая сторона (либо с помощью await
, либо путем регистрации обратного вызова Future.then()
).Нет значения, возвращаемого асинхронной работой, но вызывающие могут определить, когда она завершена.
Функции, отмеченные async
, обычно должны возвращать Future
.Если у вас есть функция, выполняющая асинхронную работу, которая выдает фактическое значение (например, int
), то вызывающая сторона должна дождаться вычисления этого значения, прежде чем его можно будет использовать.Поэтому эта функция должна возвращать Future
.
. В особом случае функция async
может возвращать void
вместо Future<void>
, чтобы указать, что она запущена и забыта.