返回

Dart 中的 async 和 async* 的区别

前端

在 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 对象代表一个异步数据流,它可以被用来接收和处理数据。