Что происходит, когда я возвращаю Future из функции, помеченной в Dart как асинхронная?

Рассмотрим этот пример:

Future<int> doAsyncThing() => new Future.value(42);

usingAsync() async => doAsyncThing();

main() {
  var thing = usingAsync();
  // what is the runtimeType of thing ?
}

Что такое runtimeType объекта, возвращаемого usingAsync()? Будет ли это Future<Future<int>> или же Future<int> или что-то другое?

1 ответ

Тип возврата usingAsync() технически dynamic потому что нет аннотации возвращаемого типа для usingAsync(), Пропуск аннотации типа возврата аналогичен использованию dynamic для аннотации возвращаемого типа.

RuntimeType объекта, возвращаемого usingAsync() является Future<dynamic>, Функции, отмеченные async просто всегда возвращаю Future<dynamic> объект.

Когда будущее из usingAsync() завершает, он "сплющивает" свое будущее, и завершает с int,

import 'dart:async';

Future<int> doAsyncThing() => new Future.value(42);

usingAsync() async => doAsyncThing();

main() {
  var thing = usingAsync();

  // what is the runtimeType of thing ?
  print(thing.runtimeType); // Future

  thing.then((value) {
    print(value);  // 42
    print(value.runtimeType);  // int
  });
}

Автор примера кода в исходном вопросе, вероятно, хочет написать:

Future<int> usingAsync() async => await doAsyncThing();

Или даже чище:

Future<int> usingAsync() => doAsyncThing();

То есть, если ваша функция возвращает Future, вам может не потребоваться помечать вашу функцию как асинхронную. Просто верни Будущее.

Посмотрите это в действии: https://dartpad.dartlang.org/73fed0857efab196e3f9

Другие вопросы по тегам