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

Mag*_*s W 6 asynchronous future async-await dart dart-async

有没有之间的差异async方法,返回void,和一个回报Future<void>?似乎两者在 Dart 中都有效:

void main() async {
    await myVoid();
    await myFutureVoid();
}


void myVoid() async {
    // Do something
}


Future<void> myFutureVoid() async {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

它们相同吗?

如果是这样,为什么void在例如不允许时允许int?编译器说“标记为 'async' 的函数必须具有可分配给 'Future' 的返回类型”

jam*_*lin 17

void f()并且Future<void> f()不相同。(async关键字的存在实际上并不重要。async关键字主要允许await在函数体中使用关键字。)

void f()声明一个不返回任何内容的函数。如果它执行异步工作,那么该工作将是“即发即忘”:调用方没有机会f等待它完成。

相反,Future<void> f()声明一个函数,该函数返回Future调用者可以等待(通过使用await或注册Future.then()回调)。异步工作没有返回值,但调用者可以确定它何时完成。

标有 的函数async 通常应该返回一个Future. 如果您有一个执行异步工作并产生实际值(例如int)的函数,则调用者必须等待该值被计算后才能使用。因此,该函数必须返回 a Future

作为一种特殊情况,async函数可以返回void而不是Future<void>指示它是即发即忘的。