如何确定传递的函数是否是异步函数。例如:
void checkSync(Function func) {
if (func is asynchronous) print('async function');
else print ('not async function');
}
Run Code Online (Sandbox Code Playgroud)
异步的唯一值得信赖的证据是它返回一个 future。
在不知道参数数量的情况下,没有好的方法来检查返回类型。你可以试试:
void chcekSync(Function func) {
if (func is Future Function()) return true;
if (func is Future Function(Never)) return true;
if (func is Future Function(Never, Never)) return true;
if (func is Future Function(Never, Never, Never)) return true;
// Repeat as long as you want to.
return false;
}
Run Code Online (Sandbox Code Playgroud)
这仅适用于位置参数。当 Dart 获取所需的命名参数时,将无法识别使用此类参数的函数。
显然,如果您知道签名,那么就容易得多:
bool isAsync(dynamic Function(Never, Never) func) =>
func is Future<dynamic> Function(Never, Never);
Run Code Online (Sandbox Code Playgroud)
该Never类型(或者Null直到 Dart 获得不可为空类型之前)是类型层次结构的底部类型。这意味着由于函数子类型的工作方式,它是所有dynamic Function(Never, Never)双位置参数函数的超类型。
上面仅检测到该函数必须返回 a Future,而不是它可以。返回类型为 的函数Object 可能返回 future,也可能不返回。只有打电话才能确定。返回类型为 的函数FutureOr<Something> 可能会返回 future,而且这种可能性是存在的。您可能希望将其视为异步函数,如果是这样,请在上面的类型测试中更改Future<dynamic>为。FutureOr<dynamic>
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |