Menu
Coddy logo textTech

Futures y async/await

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 76 de 110.

En las aplicaciones reales, muchas operaciones toman tiempo: obtener datos de un servidor, leer archivos o esperar la entrada del usuario. Dart maneja esto con Future, que representa un valor que estará disponible en algún momento en el futuro.

Un Future es como una promesa: "Te daré el resultado cuando esté listo". Puedes crear uno usando Future.delayed() para simular una operación que toma tiempo:

Future<String> fetchUserName() {
  return Future.delayed(
    Duration(seconds: 1),
    () => 'Alice',
  );
}

Para trabajar con el resultado de un Future, usa async y await. Marca tu función como async, después usa await para pausar la ejecución hasta que se complete el Future:

Future<void> main() async {
  print('Fetching user...');
  String name = await fetchUserName();
  print('Hello, $name!');
}

Future<String> fetchUserName() {
  return Future.delayed(
    Duration(seconds: 1),
    () => 'Alice',
  );
}

Sin await, obtendrías un Future<String> en lugar de la cadena real. La palabra clave await desenvuelve el Future y te proporciona el valor que contiene. Ten en cuenta que cualquier función que use await debe marcarse como async y devuelve automáticamente un Future.

También puedes devolver valores directamente desde funciones asíncronas; Dart los envuelve automáticamente en un Future:

Future<int> calculateTotal() async {
  var a = await fetchNumber();
  var b = await fetchNumber();
  return a + b;  // Envuelto automáticamente en Future<int>
}
challenge icon

Desafío

Fácil

¡Construyamos un servicio meteorológico que simule la obtención de datos meteorológicos de diferentes ciudades! Practicarás el uso de Future, async y await para gestionar operaciones que tardan en completarse.

Organizarás tu código en dos archivos:

  • weather_service.dart: Crea una clase WeatherService que simule la obtención de información meteorológica. Tu clase debe tener:
    • Un método fetchTemperature(String city) que devuelva un Future<int>. Usa Future.delayed() con una duración de 100 milisegundos para simular el retraso de la red. El método debe devolver una temperatura basada en el nombre de la ciudad: devuelve la longitud del nombre de la ciudad multiplicada por 3.
    • Un método fetchCondition(String city) que devuelva un Future<String>. Usa Future.delayed() con un retraso de 100 milisegundos. Devuelve 'Sunny' si el nombre de la ciudad tiene un número par de caracteres; de lo contrario, devuelve 'Cloudy'.
    • Un método asíncrono getFullReport(String city) que devuelva un Future<String>. Este método debe esperar a que terminen tanto fetchTemperature como fetchCondition y después devolver una cadena con formato: '[city]: [temperature]C, [condition]'
  • main.dart: Importa tu servicio meteorológico y demuestra cómo funcionan las operaciones asíncronas. Tu función principal debe ser asíncrona y:
    • Crear una instancia de WeatherService
    • Imprimir Fetching weather data...
    • Esperar e imprimir el informe completo de 'Paris'
    • Esperar e imprimir el informe completo de 'Tokyo'
    • Esperar e imprimir el informe completo de 'London'
    • Imprimir Done!

Observa cómo cada llamada a getFullReport espera a que se obtengan tanto la temperatura como la condición antes de devolver el resultado combinado. ¡La palabra clave await pausa la ejecución hasta que se completa cada Future!

Salida esperada:

Fetching weather data...
Paris: 15C, Cloudy
Tokyo: 15C, Cloudy
London: 18C, Sunny
Done!

Pruébalo tú mismo

import 'weather_service.dart';

Future<void> main() async {
  // TODO: Crea una instancia de WeatherService
  
  // TODO: Imprime 'Fetching weather data...'
  
  // TODO: Espera e imprime el informe completo para 'Paris'
  
  // TODO: Espera e imprime el informe completo para 'Tokyo'
  
  // TODO: Espera e imprime el informe completo para 'London'
  
  // TODO: Imprime 'Done!'
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online