Skip to content
Dart

Async/Await and Futures

Asynchronous programming with Future and async/await.

By EZ4Code Team
asyncfuturestream

Code

Future<String> fetchUser(int id) async {
  await Future.delayed(Duration(seconds: 1));
  return 'user-$id';
}

Future<List<String>> fetchUsers(List<int> ids) async {
  // Parallel: wait for all
  final results = await Future.wait(ids.map(fetchUser));
  return results;
}

Future<void> main() async {
  // Single await
  final user = await fetchUser(1);
  print(user);  // user-1

  // Parallel
  final users = await fetchUsers([1, 2, 3]);
  print(users);  // [user-1, user-2, user-3]

  // Error handling
  try {
    final data = await fetchData();
  } catch (e) {
    print('Error: $e');
  }

  // Future.then (alternative)
  fetchUser(2).then((u) => print(u)).catchError((e) => print(e));
}

// Stream (multiple async values)
Stream<int> counter(int max) async* {
  for (var i = 0; i < max; i++) {
    await Future.delayed(Duration(milliseconds: 100));
    yield i;
  }
}

Explanation

async/await is sugar over Futures — the function is rewritten to return a Future. Future.wait runs futures in parallel (like Promise.all). async* defines a generator that yields a Stream — use await for to consume. Streams are Dart's reactive primitive (like Observables). Always mark async functions with async; errors propagate as rejected Futures.

More Dart Snippets