type
status
date
slug
summary
tags
category
icon
password
<ins/>
在 Dart 中,asyncasync* 都是用于定义异步函数的关键字,但它们有一些显著区别,主要体现在返回类型和使用方式上:

1. 返回类型不同

  • async:用于定义返回 Future 的异步函数。async 函数在执行时会返回一个 Future 对象,表示将来的某个时间点会提供一个值。
  • async*:用于定义返回 Stream 的异步生成器函数。async* 函数在执行时会返回一个 Stream,可以多次产生值,而不是像 async 函数一样只产生一次值。

2. 使用关键字不同

  • await:在 async 函数中,可以使用 await 关键字等待异步操作完成,然后再继续执行后续代码。
  • yieldyield*:在 async* 函数中,使用 yield 关键字一次产生一个值,提供给监听此 Stream 的订阅者。yield* 用于将一个 Stream 中的所有值转发给订阅者。

示例对比

async 示例

async 函数一次性返回一个 Future,可以通过 await 等待其结果:
在这个例子中,asyncExample 是一个异步函数,在 Future.delayed 延迟 2 秒后返回一个 int42

async* 示例

async* 函数可以使用 yield 产生多个值,并返回一个 Stream
在这个例子中,asyncStarExample 是一个异步生成器函数。它每次 yield 一个值,并返回一个 Stream。通过 await for 循环,我们可以逐个读取 Stream 中的每个值。

3. 适用场景

  • 使用 async:当函数是异步的,并且只会返回一个结果(例如执行完某个异步操作后得到一个单一值)。
  • 使用 async*:当函数是异步的,并且需要返回多个结果(例如逐步生成一系列值,或监听事件流)。

总结

特性
async
async*
返回类型
Future
Stream
使用关键字
await
yield, yield*
使用场景
异步返回单一值
异步生成多个值
  • async 适合一次性返回结果的异步操作。
  • async* 适合返回一系列结果的异步生成器。
<ins/>