返回async
的{{1}}方法和返回void
的方法之间有区别吗?似乎两者在Dart中都是有效的:
Future<void>
它们相同吗?
如果是这样,为什么在不允许void main() async {
await myVoid();
await myFutureVoid();
}
void myVoid() async {
// Do something
}
Future<void> myFutureVoid() async {
// Do something
}
的情况下允许void
?编译器说“标记为'async'的函数必须具有可分配给'Future'的返回类型” 。
答案 0 :(得分:1)
void f()
和Future<void> f()
不同。 (实际上,async
关键字的存在并不重要。async
关键字主要用于在函数体中使用await
关键字。)
void f()
声明一个不返回任何内容的函数。如果它完成异步工作,则该工作将“即兴即忘”:f
的调用者没有机会等待它完成。
相反,Future<void> f()
声明一个函数,该函数返回调用方可以等待的Future
(通过使用await
或注册Future.then()
回调)。异步工作没有返回任何值,但是调用者可以确定何时完成。
通常用async
标记的功能 应该返回一个Future
。如果您有一个执行异步工作并产生实际值的函数(例如int
),则调用方必须等待该值被计算后才能使用。因此,该函数必须返回Future
。
在特殊情况下,async
函数可以返回void
而不是Future<void>
来表明它是即发即弃。