【问题标题】:dart flutter - Why is this await unnecessary?dart flutter - 为什么这是不必要的等待?
【发布时间】:2022-12-03 04:05:07
【问题描述】:

我的 linter 告诉我这个 await 是不必要的:

不必要的 await 关键字作为回报。

我想如果你在异步函数中调用一个函数并且你想要获取/返回值,而不是未来你必须使用 await 来指定你想要的值,而不是未来。

我在这里错过了什么吗?

【问题讨论】:

  • 复制/粘贴代码比使用屏幕截图更有帮助,这样人们(比如我)也可以复制/粘贴代码。

标签: dart async-await


【解决方案1】:

在异步函数中,如果要返回的值不是 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 的结果完成。

我希望这有帮助!

【讨论】:

    【解决方案2】:

    作为the documentation for that recommendation points out,您可以取下async并返回Future,而不是使用await

    Future<Dictionary> get _localDir => getApplicationDocumentsDirectory();
    

    这称为“消除异步/等待”。 Stephen Cleary 写了一篇关于它的文章,您可能会发现它有帮助:Eliding Async and Await

    简而言之,在以下情况下执行此操作会更有效:

    通过不包括这些关键字,编译器可以跳过生成异步状态机。这意味着程序集中编译器生成的类型更少,垃圾收集器的压力更小,要执行的 CPU 指令也更少。

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 2020-08-04
      • 2022-06-11
      • 2021-06-25
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多