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

Set*_*add 5 dart dart-async

考虑以下示例:

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

usingAsync() async => doAsyncThing();

main() {
  var thing = usingAsync();
  // what is the runtimeType of thing ?
}
Run Code Online (Sandbox Code Playgroud)

返回的对象的runtimeType是什么usingAsync()?是Future<Future<int>>还是Future<int>其他?

Set*_*add 6

usingAsync()技术上讲,返回类型是dynamic因为没有为给出返回类型注释usingAsync()。省略返回类型注释与使用dynamic返回类型注释相同。

返回的对象的runtimeType usingAsync()Future<dynamic>。标记为async简单的函数总是返回一个Future<dynamic>对象。

当Future from usingAsync()完成时,它将“拉平”其包含的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
  });
}
Run Code Online (Sandbox Code Playgroud)

原始问题中的代码示例的作者可能想编写:

Future<int> usingAsync() async => await doAsyncThing();
Run Code Online (Sandbox Code Playgroud)

或者,甚至更清洁:

Future<int> usingAsync() => doAsyncThing();
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您的函数返回了Future,则可能不需要将函数标记为异步。只是返回未来。

实际观看:https : //dartpad.dartlang.org/73fed0857efab196e3f9