Dart 中的 async 和 async* 的区别
2024-01-18 04:27:09
在 Dart 中,async 和 async* 是两个非常重要的,用于实现异步编程。async 用于返回 Future 对象,而 async* 用于返回 Stream 对象。
async
async 关键字用于将一个函数标记为异步函数。异步函数可以在不阻塞当前线程的情况下执行耗时操作。当一个函数被标记成 async 时,它会返回一个 Future 对象。Future 对象代表一个尚未完成的操作,它可以被用来等待操作完成并获取结果。
Future<int> sum(int a, int b) async {
return a + b;
}
上面的代码定义了一个异步函数 sum
,它返回一个 Future 对象。这个 Future 对象代表了求和操作的结果。我们可以使用 await
关键字来等待 sum
函数完成并获取结果。
int result = await sum(1, 2);
print(result); // 输出 3
async*
async* 关键字用于将一个函数标记为异步生成器函数。异步生成器函数可以生成一个异步序列。当一个函数被标记成 async* 时,它会返回一个 Stream 对象。Stream 对象代表一个异步数据流,它可以被用来接收和处理数据。
Stream<int> generateNumbers() async* {
for (int i = 0; i < 10; i++) {
yield i;
}
}
上面的代码定义了一个异步生成器函数 generateNumbers
,它返回一个 Stream 对象。这个 Stream 对象代表了一个整数序列。我们可以使用 for await
循环来接收和处理数据。
for await (int number in generateNumbers()) {
print(number); // 输出 0, 1, 2, ..., 9
}
区别
async 和 async* 的主要区别在于它们返回的对象类型。async 返回 Future 对象,而 async* 返回 Stream 对象。Future 对象代表一个尚未完成的操作,它可以被用来等待操作完成并获取结果。Stream 对象代表一个异步数据流,它可以被用来接收和处理数据。
另一个区别是 async 函数只能返回一个值,而 async* 函数可以返回一个值序列。
总结
async 和 async* 是 Dart 中实现异步编程的两个非常重要的关键字。async 用于返回 Future 对象,而 async* 用于返回 Stream 对象。Future 对象代表一个尚未完成的操作,它可以被用来等待操作完成并获取结果。Stream 对象代表一个异步数据流,它可以被用来接收和处理数据。