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/>