Dart - 区分同步和异步无效回调
Dart - Distinguish between sync and async void callbacks
假设我们有以下方法:
Future<String> foo(void callback()) async{
...
callback();
...
}
然后回调在定义时允许同步或异步。如果它是异步的,是否有一种干净的方法来 await 它?现在,如果我在这里等待,我会收到来自 IDE 的警告:
'await' applied to 'void', which is not a 'Future'
你不能。制作 async
函数 return void
而不是 Future<void>
的全部意义在于函数是“fire-and-forget” 并且调用者 不能等待它完成。
如果你想让你的foo
函数接受异步函数作为参数,那么它的参数应该是Future<void> Function()
。这样,调用者可以轻松地使用异步包装器调整同步函数。 (反过来是不可能的。)
或者您可以将 callback
参数 return 设为 FutureOr<void>
:
Future<String> foo(FutureOr<void> Function callback) async {
...
await callback();
...
}
或者如果您不想要不必要的 await
如果 callback
是同步的:
Future<String> foo(FutureOr<void> Function callback) async {
...
if (callback is Future<void> Function) {
await callback();
} else {
callback();
}
...
}
假设我们有以下方法:
Future<String> foo(void callback()) async{
...
callback();
...
}
然后回调在定义时允许同步或异步。如果它是异步的,是否有一种干净的方法来 await 它?现在,如果我在这里等待,我会收到来自 IDE 的警告:
'await' applied to 'void', which is not a 'Future'
你不能。制作 async
函数 return void
而不是 Future<void>
的全部意义在于函数是“fire-and-forget” 并且调用者 不能等待它完成。
如果你想让你的foo
函数接受异步函数作为参数,那么它的参数应该是Future<void> Function()
。这样,调用者可以轻松地使用异步包装器调整同步函数。 (反过来是不可能的。)
或者您可以将 callback
参数 return 设为 FutureOr<void>
:
Future<String> foo(FutureOr<void> Function callback) async {
...
await callback();
...
}
或者如果您不想要不必要的 await
如果 callback
是同步的:
Future<String> foo(FutureOr<void> Function callback) async {
...
if (callback is Future<void> Function) {
await callback();
} else {
callback();
}
...
}