Google News
logo
Dart - Interview Questions
How do you handle asynchronous operations in Dart?
In Dart, asynchronous operations are handled using asynchronous programming techniques, which allow you to perform operations without blocking the execution of your code. Asynchronous programming is particularly useful when dealing with time-consuming tasks such as network requests, file operations, or interactions with databases. Dart provides several mechanisms to handle asynchronous operations:

1. Future and async/await : Dart utilizes the `Future` class, which represents a value that may not be available immediately. The `async` and `await` keywords are used together to work with asynchronous operations in a synchronous manner, making the code more readable and easier to follow.

   * `async`: The `async` keyword is used to mark a function as asynchronous. It allows you to use the `await` keyword within the function body to wait for the completion of asynchronous operations.

   * `await`: The `await` keyword is used to pause the execution of an `async` function until a `Future` completes. It allows you to extract the result of the `Future` once it's available.

   Here's an example that demonstrates the usage of `async` and `await`:
   Future<void> fetchData() async {
     // Simulating an asynchronous operation
     await Future.delayed(Duration(seconds: 2));
     print('Data fetched!');
   }

   void main() {
     print('Start');
     fetchData();
     print('End');
   }​

   Output :
   Start
   End
   Data fetched!​

   In the example above, the `fetchData` function is marked as `async`, and the `await` keyword is used to pause the execution until the `Future.delayed` operation completes. The delay simulates an asynchronous operation, and once the delay is over, the code resumes execution, and "Data fetched!" is printed.

2. Callbacks and Futures : Dart also provides the option to handle asynchronous operations using callbacks and `Future` objects directly. This approach involves registering callbacks to be executed when a `Future` completes.
   void fetchData() {
     Future.delayed(Duration(seconds: 2)).then((_) {
       print('Data fetched!');
     });
   }

   void main() {
     print('Start');
     fetchData();
     print('End');
   }​

   Output :
   Start
   End
   Data fetched!​
   In this example, the `then` method is used to register a callback to be executed when the `Future.delayed` operation completes. Once the delay is over, the callback is invoked, and "Data fetched!" is printed.

3. Streams : Dart provides a `Stream` class to handle continuous asynchronous data streams, such as real-time data feeds or event streams. Streams are a sequence of asynchronous events that can be listened to and processed.
   Stream<int> countDown(int from) async* {
     for (int i = from; i >= 0; i--) {
       await Future.delayed(Duration(seconds: 1));
       yield i;
     }
   }

   void main() {
     print('Start');
     countDown(5).listen((value) {
       print(value);
     });
     print('End');
   }​

   Output :
   Start
   End
   5
   4
   3
   2
   1
   0​

   In this example, the `countDown` function returns a `Stream` that emits integers from a given number down to zero. The `listen` method is used to subscribe to the stream and receive the emitted values. As the countdown progresses, the callback inside `listen` is invoked for each emitted
Advertisement