dart:async 库
支持异步编程,包括 Future 和 Stream 等类。
Future 和 Stream 是 Dart 中异步编程的基本构建块。通过 async
和 async*
函数语言直接支持,并通过 dart:core
库对所有库开放。
本库提供进一步的工具来创建、消费和转换 futures 和 streams,以及直接访问其他异步原语,如 Timer、scheduleMicrotask 和 Zone。
在您的代码中使用此库
import 'dart:async';
Future
Future 对象表示一个可能在未来某个时间点返回值的计算。Future 在完成时返回计算的值。Future 通常用于使用不同线程或隔离实现的 API(例如,dart:io
中的异步 I/O 操作或 dart:html
中的 HTTP 请求)。
Dart 库中的许多方法在执行任务时返回 Future
。例如,将 HttpServer
绑定到主机和端口时,bind()
方法返回一个 Future
。
HttpServer.bind('127.0.0.1', 4444)
.then((server) => print('${server.isBroadcast}'))
.catchError(print);
Future.then 注册了一个回调函数,该函数在 Future 的操作(例如 bind()
方法)成功完成时运行。操作返回的值传递到回调函数中。在本例中,bind()
方法返回 HttpServer 对象。回调函数打印其中一个属性。 Future.catchError 注册了一个回调函数,如果 Future 内部发生错误,则运行此函数。
Stream
Stream 提供了异步数据序列。数据序列的例子包括单个事件,如鼠标点击,或较大数据序列的连续块,如包含文件内容的多个字节列表。以下示例打开文件进行读取。 Stream.listen 注册了每次更多数据可用、发生错误或流完成后将运行的回调函数。在 Stream 上提供了更多功能,通过调用 Stream.listen 获取实际数据来实现。
Stream<List<int>> stream = File('quotes.txt').openRead();
stream.transform(utf8.decoder).forEach(print);
此流发出一系列的字节列表。然后程序必须以某种方式处理这些字节列表。在此,代码使用 UTF-8 解码器(提供在 dart:convert
库中)将字节序列转换为 Dart 字符串序列。
流的另一个常用用途是在 Web 应用中对用户生成的事件进行监听:以下代码监听按钮上的鼠标点击。
querySelector('#myButton')!.onClick.forEach((_) => print('Click.'));
其他资源
-
库探索中 dart:async 部分:异步编程的简要概述。
-
使用基于 Future 的 API:更详细地了解 Futures 及其如何用于编写异步 Dart 代码。
-
Futures 和错误处理:关于处理使用 Futures 时发生的错误和异常的所有信息(但您可能害怕询问)。
-
事件循环与 Dart:了解 Dart 如何处理事件队列和微任务队列,以便您可以编写更少意外的异步代码。
-
test 包:异步测试:如何测试异步代码。
类
-
Completer<
T> - 生成Future对象的方法,稍后可以使用值或错误来完成它们。
-
EventSink<
T> - 支持添加错误的Sink。
-
Future<
T> - 异步计算的结果。
-
FutureOr<
T> - 表示值可以是
Future<T>
或T
的类型。 -
MultiStreamController<
T> - 由Stream.multi提供的高级流控制器。
-
Stream<
T> - 异步数据事件的来源。
-
StreamConsumer<
S> - 接受多个整个流的抽象接口。
-
StreamController<
T> - 包含它控制的流的控制器。
-
StreamIterator<
T> - 类似于Iterator的接口,用于Stream的值。
-
StreamSink<
S> - 一个同步和异步地接受流事件的的对象。
-
StreamSubscription<
T> - 对Stream事件的订阅。
-
StreamTransformer<
S, T> - 转换流。
-
StreamTransformerBase<
S, T> - StreamTransformer实现的基类。
-
StreamView<
T> - 仅暴露Stream接口的Stream包装。
-
SynchronousStreamController<
T> - 同步交付事件的流控制器。
- 定时器
- 可以配置为一次性或重复触发的倒计时定时器。
- 区域
- 区域代表在异步调用间保持稳定的 环境。
- ZoneDelegate
- 对父区域的一个适应性视图。
- ZoneSpecification
- 一个参数对象,用于Zone.fork的定制区域函数处理器。
扩展
-
FutureExtensions on Future<
T> - 在futures上提供便利方法。
-
FutureIterable on Iterable<
Future< T> > -
FutureRecord2 on (Future<
T1> , Future<T2> ) - 对记录的future的并行操作。
-
FutureRecord3 在 (Future<
T1> , Future<T2> , Future<T3> ) 上 - 对记录的future的并行操作。
-
FutureRecord4 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> ) 上 - 对记录的future的并行操作。
-
FutureRecord5 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> ) 上 - 对记录的future的并行操作。
-
FutureRecord6 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> ) 上 - 对记录的future的并行操作。
-
FutureRecord7 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> , Future<T7> ) 上 - 对记录的future的并行操作。
-
FutureRecord8 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> , Future<T7> , Future<T8> ) 时触发 - 对记录的future的并行操作。
-
FutureRecord9 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> , Future<T7> , Future<T8> , Future<T9> ) 时触发 - 对记录的future的并行操作。
函数
-
runZoned<
R> (R body(), {Map<Object?, Object?> ? zoneValues, ZoneSpecification? zoneSpecification, Function? onError}) → R - 在自身的区域中运行
body
。 -
runZonedGuarded<
R> (R body(), void onError(Object error, StackTrace stack), {Map<Object?, Object?> ? zoneValues, ZoneSpecification? zoneSpecification}) → R? - 在其自己的错误区域内运行
body
。 -
scheduleMicrotask(
void callback()) → void - 异步运行一个函数。
-
unawaited(
Future< void> ? future) → void - 显式忽略一个未来。
类型定义
- ControllerCallback = void Function()
- 流控制器
onListen
、onPause
和onResume
回调的类型。 -
ControllerCancelCallback = FutureOr<
void> Function() - 流控制器
onCancel
回调的类型。 - CreatePeriodicTimerHandler = Timer Function(Zone self, ZoneDelegate parent, Zone zone, Duration period, void f(Timer timer))
- 自定义 Zone.createPeriodicTimer 实现函数的类型。
- CreateTimerHandler = Timer Function(Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f())
- 自定义 Zone.createTimer 实现函数的类型。
- ErrorCallbackHandler = AsyncError? Function(Zone self, ZoneDelegate parent, Zone zone, Object error, StackTrace? stackTrace)
- 自定义 Zone.errorCallback 实现函数的类型。
-
ForkHandler = Zone Function(Zone self, ZoneDelegate parent, Zone zone, ZoneSpecification? specification, Map<
Object?, Object?> ? zoneValues) - 自定义 Zone.fork 实现函数的类型。
- HandleUncaughtErrorHandler = void Function(Zone self, ZoneDelegate parent, Zone zone, Object error, StackTrace stackTrace)
- 自定义 Zone.handleUncaughtError 实现函数的类型。
- PrintHandler = void Function(Zone self, ZoneDelegate parent, Zone zone, String line)
- 自定义 Zone.print 实现函数的类型。
-
注册二进制回调处理程序 = ZoneBinaryCallback<
R, T1, T2> Function<R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2)) - 自定义 Zone.registerBinaryCallback 实现函数的类型。
-
注册回调处理程序 = ZoneCallback<
R> Function<R>(Zone self, ZoneDelegate parent, Zone zone, R f()) - 自定义 Zone.registerCallback 实现函数的类型。
-
注册一元回调处理程序 = ZoneUnaryCallback<
R, T> Function<R, T>(Zone self, ZoneDelegate parent, Zone zone, R f(T arg)) - 自定义 Zone.registerUnaryCallback 实现函数的类型。
-
运行二进制处理程序 = R Function<
R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2) - 自定义 Zone.runBinary 实现函数的类型。
-
RunHandler = R 函数<
R>(Zone self, ZoneDelegate parent, Zone zone, R f()) - 自定义 Zone.run 实现函数的类型。
-
RunUnaryHandler = R 函数<
R, T>(Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg) - 自定义 Zone.runUnary 实现函数的类型。
- ScheduleMicrotaskHandler = void 函数(Zone self, ZoneDelegate parent, Zone zone, void f())
- 自定义 Zone.scheduleMicrotask 实现函数的类型。
-
ZoneBinaryCallback<
R, T1, T2> = R 函数(T1, T2) -
ZoneCallback<
R> = R 函数() -
ZoneUnaryCallback<
R, T> = R 函数(T)
异常 / 错误
- AsyncError
- 包含错误和堆栈跟踪。
- DeferredLoadException
- 当延迟库失败加载时抛出。
-
ParallelWaitError<
V, E> - 在外部等待多个未来时,当一些有错误时抛出。
- TimeoutException
- 在等待异步结果时,定时超时发生时抛出。