// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. /// Support for asynchronous programming, /// with classes such as Future and Stream. /// /// [Future]s and [Stream]s are the fundamental building blocks /// of asynchronous programming in Dart. They are supported /// directly in the language through `async` and `async*` /// functions, and are available to all libraries through /// the `dart:core` library. /// /// This library provides further tools for creating, consuming /// and transforming futures and streams, as well as direct access to /// other asynchronous primitives like [timers][Timer], /// [microtasks][scheduleMicrotask] and [zones][Zone]. /// /// To use this library in your code: /// ```dart /// import 'dart:async'; /// ``` /// ## Future /// /// A Future object represents a computation whose return value /// might not yet be available. /// The Future returns the value of the computation /// when it completes at some time in the future. /// Futures are often used for APIs that are implemented using a /// different thread or isolate (e.g., the asynchronous I/O /// operations of `dart:io` or HTTP requests of `dart:html`). /// /// Many methods in the Dart libraries return `Future`s when /// performing tasks. For example, when binding an `HttpServer` /// to a host and port, the `bind()` method returns a Future. /// ```dart import:io /// HttpServer.bind('127.0.0.1', 4444) /// .then((server) => print('${server.isBroadcast}')) /// .catchError(print); /// ``` /// [Future.then] registers a callback function that runs /// when the Future's operation, in this case the `bind()` method, /// completes successfully. /// The value returned by the operation /// is passed into the callback function. /// In this example, the `bind()` method returns the HttpServer /// object. The callback function prints one of its properties. /// [Future.catchError] registers a callback function that /// runs if an error occurs within the Future. /// /// ## Stream /// /// A Stream provides an asynchronous sequence of data. /// Examples of data sequences include individual events, like mouse clicks, /// or sequential chunks of larger data, like multiple byte lists with the /// contents of a file /// such as mouse clicks, and a stream of byte lists read from a file. /// The following example opens a file for reading. /// [Stream.listen] registers callback functions that run /// each time more data is available, an error has occurred, or /// the stream has finished. /// Further functionality is provided on [Stream], implemented by calling /// [Stream.listen] to get the actual data. /// ```dart import:io import:convert /// Stream> stream = File('quotes.txt').openRead(); /// stream.transform(utf8.decoder).forEach(print); /// ``` /// This stream emits a sequence of lists of bytes. /// The program must then handle those lists of bytes in some way. /// Here, the code uses a UTF-8 decoder (provided in the `dart:convert` library) /// to convert the sequence of bytes into a sequence /// of Dart strings. /// /// Another common use of streams is for user-generated events /// in a web app: The following code listens for mouse clicks on a button. /// ```dart import:html /// querySelector('#myButton')!.onClick.forEach((_) => print('Click.')); /// ``` /// ## Other resources /// /// * The [dart:async section of the library tour][asynchronous-programming]: /// A brief overview of asynchronous programming. /// /// * [Use Future-Based APIs][futures-tutorial]: A closer look at Futures and /// how to use them to write asynchronous Dart code. /// /// * [Futures and Error Handling][futures-error-handling]: Everything you /// wanted to know about handling errors and exceptions when working with /// Futures (but were afraid to ask). /// /// * [The Event Loop and Dart](https://dart.dev/articles/event-loop/): /// Learn how Dart handles the event queue and microtask queue, so you can /// write better asynchronous code with fewer surprises. /// /// * [test package: Asynchronous Tests][test-readme]: How to test asynchronous /// code. /// /// [asynchronous-programming]: https://dart.dev/guides/libraries/library-tour#dartasync---asynchronous-programming /// [futures-tutorial]: https://dart.dev/codelabs/async-await /// [futures-error-handling]: https://dart.dev/guides/libraries/futures-error-handling /// [test-readme]: https://pub.dev/packages/test /// /// {@category Core} library dart.async; import "dart:collection" show HashMap; import 'dart:developer' show Timeline; import "dart:_internal" show CastStream, CastStreamTransformer, checkNotNullable, IterableElementError, nullFuture, printToZone, printToConsole, Since, typeAcceptsNull, unsafeCast, vmIsolateUnsendable; part 'async_error.dart'; part 'broadcast_stream_controller.dart'; part 'deferred_load.dart'; part 'future.dart'; part 'future_extensions.dart'; part 'future_impl.dart'; part 'schedule_microtask.dart'; part 'stream.dart'; part 'stream_controller.dart'; part 'stream_impl.dart'; part 'stream_pipe.dart'; part 'stream_transformers.dart'; part 'timer.dart'; part 'zone.dart'; part 'zone_api.dart'; part 'zone_delegate.dart'; part 'zone_root.dart'; part 'zone_specification.dart';