Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Dart-区分同步和异步无效回调_Asynchronous_Dart_Future_Void_Synchronous - Fatal编程技术网

Asynchronous Dart-区分同步和异步无效回调

Asynchronous Dart-区分同步和异步无效回调,asynchronous,dart,future,void,synchronous,Asynchronous,Dart,Future,Void,Synchronous,假设我们有以下方法: Future<String> foo(void callback()) async{ ... callback(); ... } Future foo(void callback())异步{ ... 回调(); ... } 然后,在定义时,回调可以是同步的,也可以是异步的。如果它是异步的,是否有一种干净的方法来等待它?现在,如果我在这里等待它,我会从IDE得到以下警告: “等待”适用于“无效”,它不是“未来” 你不能。使async函数

假设我们有以下方法:

Future<String> foo(void callback()) async{
    ...
    callback();
    ...
}
Future foo(void callback())异步{
...
回调();
...
}
然后,在定义时,回调可以是同步的,也可以是异步的。如果它是异步的,是否有一种干净的方法来等待它?现在,如果我在这里等待它,我会从IDE得到以下警告:

“等待”适用于“无效”,它不是“未来”


你不能。使
async
函数返回
void
而不是
Future
的关键在于,函数是“触发并忘记”的,因此调用方不能等待它完成

如果希望允许
foo
函数将异步函数作为参数,则其参数应为
Future function()
。这样,调用方就可以轻松地使用异步包装器调整同步函数。(不可能出现相反的情况。)

或者,您可以使
回调
参数返回一个
FutureOr

Future-foo(FutureOr函数回调)异步{
...
等待回调();
...
}
或者,如果
回调
是同步的,则不需要不必要的
等待

Future-foo(FutureOr函数回调)异步{
...
if(回调是未来函数){
等待回调();
}否则{
回调();
}
...
}

你不能。使
async
函数返回
void
而不是
Future
的关键在于,函数是“触发并忘记”的,因此调用方不能等待它完成

如果希望允许
foo
函数将异步函数作为参数,则其参数应为
Future function()
。这样,调用方就可以轻松地使用异步包装器调整同步函数。(不可能出现相反的情况。)

或者,您可以使
回调
参数返回一个
FutureOr

Future-foo(FutureOr函数回调)异步{
...
等待回调();
...
}
或者,如果
回调
是同步的,则不需要不必要的
等待

Future-foo(FutureOr函数回调)异步{
...
if(回调是未来函数){
等待回调();
}否则{
回调();
}
...
}

如果使用Future callback(),则会收到警告[此函数的返回类型为'Future',但不会以return语句结尾],这意味着每次调用foo时都应该使用async关键字。因此,无论哪种方式,我都可能会收到一些警告,但您建议,从调用方的角度来看,未来的方式更清晰,对吗?在本例中,我将使用
Future或
。它是一个参数,因此处理可选异步结果的痛苦在于使用该参数的函数的作者,而不是函数的用户。给自己更多的工作没关系。不要从API返回
未来或
,这会将麻烦推到用户身上。只要返回一个未来。@navid是的,我建议调用方可以在
()async=>originalCallback()中包装同步回调。我还用
FutureOr
示例更新了我的答案。如果我使用Future callback(),则会得到警告[此函数的返回类型为'Future',但不会以return语句结尾],这意味着每次调用foo时都应该使用async关键字。因此,无论哪种方式,我都可能会收到一些警告,但您建议,从调用方的角度来看,未来的方式更清晰,对吗?在本例中,我将使用
Future或
。它是一个参数,因此处理可选异步结果的痛苦在于使用该参数的函数的作者,而不是函数的用户。给自己更多的工作没关系。不要从API返回
未来或
,这会将麻烦推到用户身上。只要返回一个未来。@navid是的,我建议调用方可以在
()async=>originalCallback()中包装同步回调。我还用
FutureOr
示例更新了我的答案。