当我从Dart中标记为async的函数返回Future时会发生什么?

时间:2015-10-10 15:10:26

标签: dart dart-async

考虑这个例子:

library(dplyr)
data %>% group_by(Team) %>%
         mutate(teamtype = ifelse(all(Gender=="M"), "OnlyM", "Mixed"))

Source: local data frame [6 x 5]
Groups: Team [3]

    Name   Age Gender   Team teamtype
  (fctr) (int) (fctr) (fctr)    (chr)
1   John    18      M      A    OnlyM
2   Luke    75      M      B    Mixed
3   Dean    20      M      C    OnlyM
4    Zoe    34      F      B    Mixed
5  Chloe    12      F      B    Mixed
6   Erik    56      M      A    OnlyM

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>>还是其他什么?

1 个答案:

答案 0 :(得分:5)

usingAsync()的返回类型在技术上是dynamic,因为没有为usingAsync()指定的返回类型注释。省略返回类型注释与使用dynamic作为返回类型注释相同。

usingAsync()返回的对象的runtimeType为Future<dynamic>。标有async的函数只会返回Future<dynamic>个对象。

当来自usingAsync()的未来完成时,它会变平&#34;它包含Future,并以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