Menu
Coddy logo textTech

Futures i async/await

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 76 z 110.

W rzeczywistych aplikacjach wiele operacji zajmuje czas — pobieranie danych z serwera, odczytywanie plików lub oczekiwanie na dane wejściowe od użytkownika. Dart obsługuje je za pomocą Future, który reprezentuje wartość dostępną w przyszłości.

Future przypomina obietnicę: „Podam ci wynik, gdy będzie gotowy”. Możesz utworzyć ją za pomocą Future.delayed(), aby zasymulować operację, która zajmuje trochę czasu:

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

Aby pracować z wynikiem obiektu Future, użyj async i await. Oznacz swoją funkcję jako async, a następnie użyj await, aby wstrzymać wykonywanie do momentu zakończenia obiektu 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',
  );
}

Bez await otrzymasz Future<String> zamiast właściwego ciągu znaków. Słowo kluczowe await rozpakowuje Future i zwraca zawartą w nim wartość. Pamiętaj, że każda funkcja używająca await musi być oznaczona jako async i automatycznie zwraca Future.

Możesz też zwracać wartości bezpośrednio z funkcji asynchronicznych — Dart automatycznie opakowuje je w Future:

Future<int> calculateTotal() async {
  var a = await fetchNumber();
  var b = await fetchNumber();
  return a + b;  // Automatycznie opakowane w Future<int>
}
challenge icon

Wyzwanie

Łatwy

Zbudujmy usługę pogodową, która symuluje pobieranie danych pogodowych z różnych miast! Poćwiczysz korzystanie z Future, async i await, aby obsługiwać operacje, których ukończenie wymaga czasu.

Podzielisz swój kod na dwa pliki:

  • weather_service.dart: Utwórz klasę WeatherService, która symuluje pobieranie informacji o pogodzie. Twoja klasa powinna zawierać:
    • Metodę fetchTemperature(String city), która zwraca Future<int>. Użyj Future.delayed() z czasem trwania wynoszącym 100 milisekund, aby zasymulować opóźnienie sieciowe. Metoda powinna zwracać temperaturę zależną od nazwy miasta: długość nazwy miasta pomnożoną przez 3.
    • Metodę fetchCondition(String city), która zwraca Future<String>. Użyj Future.delayed() z opóźnieniem wynoszącym 100 milisekund. Zwróć 'Sunny', jeśli nazwa miasta ma parzystą liczbę znaków, a w przeciwnym razie zwróć 'Cloudy'.
    • Metodę asynchroniczną getFullReport(String city), która zwraca Future<String>. Ta metoda powinna zaczekać na zakończenie zarówno fetchTemperature, jak i fetchCondition, a następnie zwrócić sformatowany ciąg znaków: '[city]: [temperature]C, [condition]'
  • main.dart: Zaimportuj swoją usługę pogodową i pokaż, jak działają operacje asynchroniczne. Twoja główna funkcja powinna być asynchroniczna i:
    • Utworzyć instancję WeatherService
    • Wypisać Fetching weather data...
    • Poczekać na pełny raport dla 'Paris' i go wypisać
    • Poczekać na pełny raport dla 'Tokyo' i go wypisać
    • Poczekać na pełny raport dla 'London' i go wypisać
    • Wypisać Done!

Zauważ, że każde wywołanie getFullReport czeka na pobranie zarówno temperatury, jak i warunków pogodowych, zanim zwróci połączony wynik. Słowo kluczowe await wstrzymuje wykonywanie programu do momentu zakończenia każdego obiektu Future!

Oczekiwany wynik:

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

Spróbuj swoich sił

import 'weather_service.dart';

Future<void> main() async {
  // TODO: Utwórz instancję WeatherService
  
  // TODO: Wypisz 'Fetching weather data...'
  
  // TODO: Poczekaj na pełny raport dla 'Paris' i go wypisz
  
  // TODO: Poczekaj na pełny raport dla 'Tokyo' i go wypisz
  
  // TODO: Poczekaj na pełny raport dla 'London' i go wypisz
  
  // TODO: Wypisz 'Done!'
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online