返回
async
的 void
方法和返回 Future<void>
的方法之间有区别吗?看来两者在 Dart 中都是有效的:
void main() async {
await myVoid();
await myFutureVoid();
}
void myVoid() async {
// Do something
}
Future<void> myFutureVoid() async {
// Do something
}
它们相同吗?
如果是这样,为什么
void
是允许的,而例如 int
则不允许?编译器说“标记为‘async’的函数必须具有可分配给‘Future’的返回类型”。
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>
来指示它是即发即忘的。
不可能再等待 void 异步函数,因此歧义得到解决。 void async 函数是一个无法等待的“即发即忘”函数。在飞镖板上查看: