Что происходит, когда я возвращаю 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