Flutter开发相关:async 和 async* 在 Dart 中有什么区别?
Flutter开发相关:async 和 async* 在 Dart 中有什么区别?
在 Dart 中,async
和 async*
都是用于定义异步函数的关键字,但它们有一些显著区别,主要体现在返回类型和使用方式上。
1. 返回类型不同
- async:用于定义返回
Future
的异步函数。async 函数在执行时会返回一个Future
对象,表示将来的某个时间点会提供一个值。 - async*:用于定义返回
Stream
的异步生成器函数。async* 函数在执行时会返回一个Stream
,可以多次产生值,而不是像 async 函数一样只产生一次值。
2. 使用关键字不同
- await:在 async 函数中,可以使用
await
关键字等待异步操作完成,然后再继续执行后续代码。 - yield 和 yield*:在 async* 函数中,使用
yield
关键字一次产生一个值,提供给监听此Stream
的订阅者。yield*
用于将一个Stream
中的所有值转发给订阅者。
示例对比
async 示例
async 函数一次性返回一个 Future
,可以通过 await
等待其结果:
import 'dart:async';
Future<int> asyncExample() async {
// 模拟一个异步操作,例如网络请求或延时任务
await Future.delayed(Duration(seconds: 2));
return 42;
}
void main() async {
int result = await asyncExample();
print('Result from asyncExample: $result');
}
在这个例子中,asyncExample
是一个异步函数,在 Future.delayed
延迟 2 秒后返回一个 int
值 42
。
async* 示例
async* 函数可以使用 yield
产生多个值,并返回一个 Stream
:
import 'dart:async';
Stream<int> asyncStarExample() async* {
for (int i = 0; i < 5; i++) {
// 每次 yield 一个值
yield i;
// 模拟异步操作
await Future.delayed(Duration(seconds: 1));
}
}
void main() async {
StreamSubscription<int> subscription = asyncStarExample().listen((value) {
print('Received value: $value');
});
// 等待一段时间,确保所有值都输出
await Future.delayed(Duration(seconds: 6));
subscription.cancel(); // 取消订阅
}
在这个例子中,asyncStarExample
是一个异步生成器函数。它每次 yield
一个值,并返回一个 Stream
。通过 await for
循环,我们可以逐个读取 Stream
中的每个值。不过为了简化,这里使用了 listen
方法来监听 Stream
并打印每个值。
3. 适用场景
- 使用 async:当函数是异步的,并且只会返回一个结果(例如执行完某个异步操作后得到一个单一值)。
- 使用 async*:当函数是异步的,并且需要返回多个结果(例如逐步生成一系列值,或监听事件流)。
总结
特性 | async | async* |
---|---|---|
返回类型 | Future |
Stream |
使用关键字 | await |
yield , yield* |
使用场景 | 异步返回单一值 | 异步生成多个值 |
async
适合一次性返回结果的异步操作。async*
适合返回一系列结果的异步生成器。
更多关于Flutter开发相关:async 和 async* 在 Dart 中有什么区别?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复