使用Dart中的await和return是否有区别?

5
在我的flutter项目中,有一个名为foo(int x) async的函数。还有一个看起来像这样的bar() async函数:
Future bar() async {
  return foo(3);
}

bar() 函数只是一种将特定参数传递给 foo(int x) 的简单封装。而且在 FutureBuilder 中,bar() 用作 future

我不确定是否应该在 return 中使用 await。我在网上找不到相关文档。那么 return foo(3)return await foo(3) 之间有什么区别?谢谢!

3个回答

9

没有任何区别。

技术上,首先使用await可能会在从函数返回之前等待Future解析,但您无法看出任何区别。

无论如何,都将返回一个Future

那里的async也是无用的,它可以被箭头替换:

Future bar() => foo(3);

如果不是最后一条语句并且有一个返回语句,这可能会有影响,正如评论中指出的那样,请看下面的例子:
Future bar() async {
    try {
        return await foo(3);
    } catch(error) {
        return baz;
    }
}

如果 foo 被拒绝,那么这很重要,因为它将被调用者处理,而不是调用者。

如果等待操作引发异常会怎样? - user2864740
1
如果是直接的return,那么调用者会处理它。如果是其他位置,那肯定会有影响。更新示例以展示这一点。 - user12492341
为了给上一个注释添加更多细节。在try catch块中,总是bar()方法捕获错误,这与await关键字无关。 - FDuhen

1

由于你返回了Future,所以即使你不等待它,在这种情况下,foo(3)也会返回Future,而这正是你的函数想要返回的东西。如果你在这里等待它,那么它将在函数中等待,然后返回该值。

在这种情况下,如果foo返回Future,甚至不需要等待。然后bar的调用者将等待bar。


0

使用这个简单的例子,你可以看到打印输出的顺序:

Future<void> fetchUserOrder() {
  return Future.delayed(const Duration(seconds: 2), () => print('Large Latte'));
}

void main() async {
  await fetchUserOrder();
  print('Fetching user order...');
}

fetchUserOrder() 返回 Future。因此,如果我们在主函数中使用 await 调用它,它将接收到 Future,执行它并等待结果。只有在完成后才会继续进行主函数的第二个 print

我们也可以这样编写 fetchUserOrder()

Future<void> fetchUserOrder() async {
  return await Future.delayed(const Duration(seconds: 2), () => print('Large Latte'));
}

这不会改变结果。它的工作方式是相同的,唯一的区别就是代码更短了,现在你明白了它的工作原理。

使用 https://dartpad.dev/ 来启动这些示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接