返回 void 与返回 Future<void> 有什么区别?
What's the difference between returning void vs returning Future<void>?
returns void
的 async
方法和 returns Future<void>
的方法有区别吗?似乎两者在 Dart 中都有效:
void main() async {
await myVoid();
await myFutureVoid();
}
void myVoid() async {
// Do something
}
Future<void> myFutureVoid() async {
// Do something
}
它们相同吗?
如果是这样,为什么 void
是允许的,而例如 int
是不允许的?编译器说 "Functions marked 'async' must have a return type assignable to 'Future'".
void f()
和 Future<void> f()
不相同。 (async
关键字的存在实际上并不重要。async
关键字主要允许在函数体中使用 await
关键字。)
void f()
声明了一个 return 什么都没有的函数。如果它执行异步工作,那么该工作将是 "fire-and-forget":f
的调用者没有机会等待它完成。
相比之下,Future<void> f()
声明了一个 return 调用者可以等待的 Future
函数(通过使用 await
或注册 Future.then()
回调)。异步工作没有 return 值,但调用者可以确定它何时完成。
标有async
的函数通常应该return一个Future
。如果您有一个函数执行异步工作并产生实际值(例如 int
),那么调用者 必须 等待该值被计算后才能被计算用过的。因此该函数必须 return a Future
.
作为一个特例,一个async
函数可以return void
代替Future<void>
来表示它是fire-and-forget.
returns void
的 async
方法和 returns Future<void>
的方法有区别吗?似乎两者在 Dart 中都有效:
void main() async {
await myVoid();
await myFutureVoid();
}
void myVoid() async {
// Do something
}
Future<void> myFutureVoid() async {
// Do something
}
它们相同吗?
如果是这样,为什么 void
是允许的,而例如 int
是不允许的?编译器说 "Functions marked 'async' must have a return type assignable to 'Future'".
void f()
和 Future<void> f()
不相同。 (async
关键字的存在实际上并不重要。async
关键字主要允许在函数体中使用 await
关键字。)
void f()
声明了一个 return 什么都没有的函数。如果它执行异步工作,那么该工作将是 "fire-and-forget":f
的调用者没有机会等待它完成。
相比之下,Future<void> f()
声明了一个 return 调用者可以等待的 Future
函数(通过使用 await
或注册 Future.then()
回调)。异步工作没有 return 值,但调用者可以确定它何时完成。
标有async
的函数通常应该return一个Future
。如果您有一个函数执行异步工作并产生实际值(例如 int
),那么调用者 必须 等待该值被计算后才能被计算用过的。因此该函数必须 return a Future
.
作为一个特例,一个async
函数可以return void
代替Future<void>
来表示它是fire-and-forget.