Menu
CoddyTech

Futures & async/await

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 76 dari 110.

Dalam aplikasi nyata, banyak operasi membutuhkan waktu, seperti mengambil data dari server, membaca file, atau menunggu input dari pengguna. Dart menangani operasi ini dengan Future, yang merepresentasikan nilai yang akan tersedia nanti.

Future seperti sebuah janji: "Aku akan memberikan hasilnya saat sudah siap." Kamu bisa membuatnya menggunakan Future.delayed() untuk menyimulasikan operasi yang membutuhkan waktu:

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

Untuk mengolah hasil dari Future, gunakan async dan await. Tandai fungsi kamu dengan async, lalu gunakan await untuk menjeda eksekusi sampai Future selesai:

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

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

Tanpa await, kamu akan mendapatkan Future<String>, bukan string yang sebenarnya. Kata kunci await membuka Future dan memberikan nilai di dalamnya. Perhatikan bahwa fungsi apa pun yang menggunakan await harus ditandai dengan async, dan fungsi tersebut secara otomatis mengembalikan Future.

Kamu juga dapat mengembalikan nilai langsung dari fungsi async. Dart secara otomatis membungkusnya dalam Future:

Future<int> calculateTotal() async {
  var a = await fetchNumber();
  var b = await fetchNumber();
  return a + b;  // Otomatis dibungkus dalam Future<int>
}
challenge icon

Tantangan

Mudah

Mari buat layanan cuaca yang menyimulasikan pengambilan data cuaca dari berbagai kota! Kamu akan berlatih menggunakan Future, async, dan await untuk menangani operasi yang membutuhkan waktu untuk selesai.

Kamu akan menyusun kodemu ke dalam dua file:

  • weather_service.dart: Buat class WeatherService yang menyimulasikan pengambilan informasi cuaca. Class-mu harus memiliki:
    • Method fetchTemperature(String city) yang mengembalikan Future<int>. Gunakan Future.delayed() dengan durasi 100 milidetik untuk menyimulasikan jeda jaringan. Method ini harus mengembalikan suhu berdasarkan nama kota: kembalikan panjang nama kota dikalikan 3.
    • Method fetchCondition(String city) yang mengembalikan Future<String>. Gunakan Future.delayed() dengan jeda 100 milidetik. Kembalikan 'Sunny' jika nama kota memiliki jumlah karakter genap, jika tidak, kembalikan 'Cloudy'.
    • Method async getFullReport(String city) yang mengembalikan Future<String>. Method ini harus menunggu fetchTemperature dan fetchCondition, lalu mengembalikan string berformat: '[city]: [temperature]C, [condition]'
  • main.dart: Impor layanan cuacamu dan tunjukkan cara kerja operasi async. Fungsi utamamu harus bersifat async dan:
    • Buat instance WeatherService
    • Cetak Fetching weather data...
    • Tunggu dan cetak laporan lengkap untuk 'Paris'
    • Tunggu dan cetak laporan lengkap untuk 'Tokyo'
    • Tunggu dan cetak laporan lengkap untuk 'London'
    • Cetak Done!

Perhatikan bagaimana setiap pemanggilan getFullReport menunggu suhu dan kondisi diambil sebelum mengembalikan hasil gabungannya. Kata kunci await menjeda eksekusi hingga setiap Future selesai!

Output yang diharapkan:

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

Coba sendiri

import 'weather_service.dart';

Future<void> main() async {
  // TODO: Buat instance WeatherService
  
  // TODO: Cetak 'Fetching weather data...'
  
  // TODO: Tunggu dan cetak laporan lengkap untuk 'Paris'
  
  // TODO: Tunggu dan cetak laporan lengkap untuk 'Tokyo'
  
  // TODO: Tunggu dan cetak laporan lengkap untuk 'London'
  
  // TODO: Cetak 'Done!'
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online