返回 void 与返回 Future 之间有什么区别<void>?

问题描述 投票:0回答:2

返回

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’的返回类型”

asynchronous dart async-await future dart-async
2个回答
44
投票

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>
来指示它是即发即忘的。


0
投票

不可能再等待 void 异步函数,因此歧义得到解决。 void async 函数是一个无法等待的“即发即忘”函数。在飞镖板上查看:

https://dartpad.dev/?id=4120db2a795c9475aae027e81b99e574

© www.soinside.com 2019 - 2024. All rights reserved.