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();
    }
    ...
}