乐闻世界logo
搜索文章和话题

What 's the difference between async and async* in Dart?

1 个月前提问
1 个月前修改
浏览次数9

1个答案

1

在Dart中,asyncasync*关键字都用于处理异步操作,但它们的使用场景和返回类型有所不同。

async

当你在函数定义中使用async关键字时,这表明该函数是一个异步函数,会返回一个Future。在这样的函数中,你可以使用await关键字来暂停函数执行,直到某个异步操作完成,并获取该操作的结果。

示例:

dart
Future<String> fetchUserOrder() async { var order = await fetchAsyncFromDatabase(); return 'Your order is: $order'; }

在上面的示例中,fetchAsyncFromDatabase()是一个异步函数,返回一个未来的数据库查询结果。使用await关键字,我们可以以近乎同步的方式编写代码,等待结果,然后继续执行。

async*

使用async*关键字定义的函数是生成器函数,它返回一个Stream。这允许函数体内部使用yieldyield*关键字来提供多个值,这些值将随着时间的推移逐一被发送。

示例:

dart
Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // 逐个发送数字 } }

在这个例子中,countStream函数每隔一秒生成一个数字,直到达到指定的上限。每个yield操作实际上都是在等待一个Future.delayed的完成,这模拟了一个耗时操作的情况。

总结

  • 使用async关键字定义的函数返回一个Future,适用于单个异步结果。
  • 使用async*关键字定义的函数返回一个Stream,适用于生成多个异步事件的情景。

在实际应用中,选择async还是async*取决于你需要从函数中获取一个还是多个异步结果。

2024年8月8日 00:50 回复

你的答案