在 Dart 中,如果您有一个不返回任何内容的异步函数,它应该返回Future<void>还是简单地返回void?两者似乎都有效,但为什么呢?
void foo() async {
print('foo');
}
Future<void> bar() async {
print('bar');
}
void main() async {
await foo();
await bar();
print('baz');
}
Run Code Online (Sandbox Code Playgroud)
编译时没有错误或警告并打印
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)
在您的代码中,两个函数foo()和bar()都不返回任何内容,因此任何函数返回类型对这两个函数都有效,例如:
void/T/Future<T>... foo() async {
print('foo');
}
Future<void>/T/Future<T>... bar() async {
print('bar');
}
Run Code Online (Sandbox Code Playgroud)
和这里,
await foo();
await bar();
Run Code Online (Sandbox Code Playgroud)
await只需等待这些异步函数的执行完成即可。由于没有返回类型,await 在这里没有任何目的(冗余),因此这是也不应该是编译错误。
不同之处在于,它为您提供函数Future<void> 执行的信息bar().then(...),例如执行完成时的信息,并且还允许您使用和指定函数执行时要执行的操作bar().whenComplete(...)。
虽然foo()函数返回void并且void不保存任何像Future<void>. 如果您尝试这样做,await bar()它将将该Future对象从转换Future<void>为void.
Future只是一个容器,await一旦异步“任务”完成,就会返回值。如果没有await,Future对象会向您提供有关它们返回的函数的执行情况的信息。
| 归档时间: |
|
| 查看次数: |
3373 次 |
| 最近记录: |