【发布时间】:2022-12-03 04:05:07
【问题描述】:
不必要的 await 关键字作为回报。
我想如果你在异步函数中调用一个函数并且你想要获取/返回值,而不是未来你必须使用
await来指定你想要的值,而不是未来。我在这里错过了什么吗?
【问题讨论】:
-
复制/粘贴代码比使用屏幕截图更有帮助,这样人们(比如我)也可以复制/粘贴代码。
标签: dart async-await
不必要的 await 关键字作为回报。
我想如果你在异步函数中调用一个函数并且你想要获取/返回值,而不是未来你必须使用
await来指定你想要的值,而不是未来。我在这里错过了什么吗?
【问题讨论】:
标签: dart async-await
在异步函数中,如果要返回的值不是 Future,则无需使用 await 关键字。如果该值是 Future,那么您必须在返回之前使用 await 来解包该值。
这是一个例子:
Future<int> add(int a, int b) async {
return a + b;
}
在此示例中,add 函数被标记为异步,这意味着它返回一个 Future。在函数内部,我们返回的是a和b相加的结果,不是Future,所以不需要使用await。 add 函数返回的 Future 将以 a 和 b 相加的结果完成。
如果 add 函数返回一个 Future,那么我们需要在返回之前使用 await 来解包该值。这是一个例子:
Future<int> add(int a, int b) async {
Future<int> result = someAsyncOperation();
return await result;
}
在此示例中,add 函数被标记为异步,这意味着它返回一个 Future。在函数内部,我们调用 someAsyncOperation 函数,它返回一个 Future。然后我们使用 await 关键字等待 someAsyncOperation 返回的 Future 结果,并返回结果。 add 函数返回的 Future 将使用 someAsyncOperation 的结果完成。
我希望这有帮助!
【讨论】:
作为the documentation for that recommendation points out,您可以取下async并返回Future,而不是使用await:
Future<Dictionary> get _localDir => getApplicationDocumentsDirectory();
这称为“消除异步/等待”。 Stephen Cleary 写了一篇关于它的文章,您可能会发现它有帮助:Eliding Async and Await
简而言之,在以下情况下执行此操作会更有效:
通过不包括这些关键字,编译器可以跳过生成异步状态机。这意味着程序集中编译器生成的类型更少,垃圾收集器的压力更小,要执行的 CPU 指令也更少。
【讨论】: