В чем разница между возвращением void и возвращением Future <void>? - PullRequest
1 голос
/ 21 мая 2019

Есть ли разница между методом async, который возвращает void, и методом, который возвращает Future<void>? Похоже, что оба действительны в Dart:

void main() async {
    await myVoid();
    await myFutureVoid();
}


void myVoid() async {
    // Do something
}


Future<void> myFutureVoid() async {
    // Do something
}

Они идентичны?

Если так, то почему void разрешено, например, int? Компилятор говорит «Функции, отмеченные как« асинхронные », должны иметь возвращаемый тип, назначаемый« Будущему »» .

1 Ответ

1 голос
/ 22 мая 2019

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>, чтобы указать, что она запущена и забыта.

...