dart:async 库
支持异步编程,包含 Future 和 Stream 等类。
Future 和 Stream 是 Dart 中异步编程的基本构建块。它们通过 async
和 async*
函数直接在语言中得到支持,并且通过 dart:core
库对所有库都是可用的。
此库提供了创建、消费和转换 futures 和 streams 的进一步工具,以及直接访问其他异步原语,如 Timer、scheduleMicrotask 和 Zone。
在您的代码中使用此库
import 'dart:async';
Future
Future 对象表示一个可能在未来的某个时间点返回值的计算。Future 在未来某个时间点完成时返回计算的值。Future 经常用于实现在不同线程或 isolate 中的 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:更深入地了解 Future 及其如何用于编写异步 Dart 代码。
-
Future 和错误处理:关于在处理 Future 时处理错误和异常的所有你想知道的内容(但你可能害怕询问)。
-
事件循环与 Dart:了解 Dart 如何处理事件队列和微任务队列,以便您可以使用更少的惊喜编写更好的异步代码。
-
test package: 异步测试:如何测试异步代码。
类
-
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> - 一个同步交付其事件的流控制器。
- 定时器
- 一个可以配置为一次性或重复触发的倒计时定时器。
- 区域
- 区域代表一个在异步调用中保持稳定的 环境。
- 区域代表
- 父区域的修改视图。
- 区域规范
- 一个参数对象,包含为 Zone.fork 定制的区域函数处理器。
扩展
-
FutureExtensions 在 Future<
T> - 对未来的便利方法。
-
FutureIterable 在 Iterable<
Future< T> > -
FutureRecord2 在 (Future<
T1> , Future<T2> ) - 在未来的记录上执行并行操作。
-
FutureRecord3 在 (Future<
T1> , Future<T2> , Future<T3> ) - 在未来的记录上执行并行操作。
-
FutureRecord4 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> ) - 在未来的记录上执行并行操作。
-
FutureRecord5 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> ) - 在未来的记录上执行并行操作。
-
FutureRecord6 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> ) - 在未来的记录上执行并行操作。
-
FutureRecord7 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> , Future<T7> ) - 在未来的记录上执行并行操作。
-
FutureRecord8 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> , Future<T7> , Future<T8> ) - 在未来的记录上执行并行操作。
-
FutureRecord9 在 (Future<
T1> , Future<T2> , Future<T3> , Future<T4> , Future<T5> , Future<T6> , Future<T7> , Future<T8> , Future<T9> ) - 在未来的记录上执行并行操作。
函数
-
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 - 显式忽略一个Future。
类型定义
- 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实现函数的类型。
-
RegisterBinaryCallbackHandler = ZoneBinaryCallback<
R, T1, T2> Function<R, T1, T2>(Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2)) - 自定义Zone.registerBinaryCallback实现函数的类型。
-
RegisterCallbackHandler = ZoneCallback<
R> Function<R>(Zone self, ZoneDelegate parent, Zone zone, R f()) - 自定义Zone.registerCallback实现函数的类型。
-
RegisterUnaryCallbackHandler = ZoneUnaryCallback<
R, T> Function<R, T>(Zone self, ZoneDelegate parent, Zone zone, R f(T arg)) - 自定义Zone.registerUnaryCallback实现函数的类型。
-
RunBinaryHandler = 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 Function<
R>(Zone self, ZoneDelegate parent, Zone zone, R f()) - 自定义Zone.run实现函数的类型。
-
RunUnaryHandler = R Function<
R, T>(Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg) - 自定义 Zone.runUnary 实现函数的类型。
- ScheduleMicrotaskHandler = void Function(Zone self, ZoneDelegate parent, Zone zone, void f())
- 自定义 Zone.scheduleMicrotask 实现函数的类型。
-
ZoneBinaryCallback<
R, T1, T2> = R Function(T1, T2) -
ZoneCallback<
R> = R Function() -
ZoneUnaryCallback<
R, T> = R Function(T)
异常 / 错误
- AsyncError
- 包含错误和堆栈跟踪。
- DeferredLoadException
- 当延迟库加载失败时抛出。
-
ParallelWaitError<
V, E> - 等待多个未来对象时,当其中一些有错误时抛出。
- TimeoutException
- 在等待异步结果时,当预定超时时抛出。