La programació asíncrona és una tècnica que permet executar operacions de manera no bloquejant, és a dir, permet que el programa continuï executant altres tasques mentre espera que una operació asíncrona es completi. En Dart, la programació asíncrona és essencial per a la construcció d'aplicacions reactives i eficients, especialment quan es treballa amb operacions d'entrada/sortida (I/O) com ara la lectura de fitxers, la comunicació de xarxa o les consultes a bases de dades.

Conceptes Clau

Futures

Un Future representa una operació que es completarà en algun moment en el futur. Pot tenir tres estats:

  • Pendiente: La operació encara no s'ha completat.
  • Completat amb èxit: La operació s'ha completat amb èxit i ha retornat un valor.
  • Completat amb error: La operació s'ha completat amb un error.

Async i Await

Les paraules clau async i await s'utilitzen per treballar amb operacions asíncrones de manera més senzilla i llegible.

  • async: S'utilitza per marcar una funció com a asíncrona.
  • await: S'utilitza dins d'una funció async per esperar que un Future es completi.

Exemples Pràctics

Exemple 1: Utilitzant Futures

Future<String> fetchUserOrder() {
  // Simula una operació de xarxa amb un retard de 2 segons
  return Future.delayed(Duration(seconds: 2), () => 'Cafè amb llet');
}

void main() {
  print('Inici de la comanda');
  fetchUserOrder().then((order) {
    print('La teva comanda és: $order');
  });
  print('Fi de la comanda');
}

Explicació:

  1. fetchUserOrder retorna un Future que es completa després de 2 segons amb el valor 'Cafè amb llet'.
  2. main imprimeix 'Inici de la comanda', crida fetchUserOrder i després imprimeix 'Fi de la comanda'.
  3. Quan el Future es completa, el callback passat a then s'executa i imprimeix 'La teva comanda és: Cafè amb llet'.

Exemple 2: Utilitzant Async i Await

Future<String> fetchUserOrder() async {
  // Simula una operació de xarxa amb un retard de 2 segons
  return await Future.delayed(Duration(seconds: 2), () => 'Cafè amb llet');
}

void main() async {
  print('Inici de la comanda');
  var order = await fetchUserOrder();
  print('La teva comanda és: $order');
  print('Fi de la comanda');
}

Explicació:

  1. fetchUserOrder és una funció async que espera 2 segons abans de retornar 'Cafè amb llet'.
  2. main és també una funció async que espera el resultat de fetchUserOrder abans de continuar.

Exercicis Pràctics

Exercici 1: Simulació d'una Operació de Xarxa

Escriu una funció fetchData que simuli una operació de xarxa que triga 3 segons a completar-se i retorna la cadena 'Dades rebudes'. Utilitza async i await per esperar el resultat i imprimeix-lo a la consola.

Future<String> fetchData() async {
  // Escriu el teu codi aquí
}

void main() async {
  // Escriu el teu codi aquí
}

Solució:

Future<String> fetchData() async {
  return await Future.delayed(Duration(seconds: 3), () => 'Dades rebudes');
}

void main() async {
  print('Inici de la recuperació de dades');
  var data = await fetchData();
  print('Resultat: $data');
  print('Fi de la recuperació de dades');
}

Exercici 2: Gestió d'Errors

Modifica la funció fetchData per simular un error en la recuperació de dades. Utilitza try-catch per gestionar l'error i imprimeix un missatge d'error a la consola.

Future<String> fetchData() async {
  // Escriu el teu codi aquí
}

void main() async {
  // Escriu el teu codi aquí
}

Solució:

Future<String> fetchData() async {
  return await Future.delayed(Duration(seconds: 3), () => throw 'Error en la recuperació de dades');
}

void main() async {
  print('Inici de la recuperació de dades');
  try {
    var data = await fetchData();
    print('Resultat: $data');
  } catch (e) {
    print('S\'ha produït un error: $e');
  }
  print('Fi de la recuperació de dades');
}

Resum

En aquesta secció, hem après els conceptes bàsics de la programació asíncrona en Dart, incloent l'ús de Future, async i await. Hem vist com aquestes eines ens permeten escriure codi no bloquejant de manera més llegible i hem practicat amb exemples i exercicis pràctics. La programació asíncrona és una habilitat essencial per a qualsevol desenvolupador de Dart, especialment quan es treballa amb operacions d'entrada/sortida.

© Copyright 2024. Tots els drets reservats