type
status
date
slug
summary
tags
category
icon
password
<ins/>
在 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 等待其结果:在这个例子中,
asyncExample 是一个异步函数,在 Future.delayed 延迟 2 秒后返回一个 int 值 42。async* 示例
async* 函数可以使用 yield 产生多个值,并返回一个 Stream:在这个例子中,
asyncStarExample 是一个异步生成器函数。它每次 yield 一个值,并返回一个 Stream。通过 await for 循环,我们可以逐个读取 Stream 中的每个值。3. 适用场景
- 使用
async:当函数是异步的,并且只会返回一个结果(例如执行完某个异步操作后得到一个单一值)。
- 使用
async*:当函数是异步的,并且需要返回多个结果(例如逐步生成一系列值,或监听事件流)。
总结
特性 | async | async* |
返回类型 | Future | Stream |
使用关键字 | await | yield, yield* |
使用场景 | 异步返回单一值 | 异步生成多个值 |
async适合一次性返回结果的异步操作。
async*适合返回一系列结果的异步生成器。
<ins/>