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>
}Tantangan
MudahMari 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 classWeatherServiceyang menyimulasikan pengambilan informasi cuaca. Class-mu harus memiliki:- Method
fetchTemperature(String city)yang mengembalikanFuture<int>. GunakanFuture.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 mengembalikanFuture<String>. GunakanFuture.delayed()dengan jeda 100 milidetik. Kembalikan'Sunny'jika nama kota memiliki jumlah karakter genap, jika tidak, kembalikan'Cloudy'. - Method async
getFullReport(String city)yang mengembalikanFuture<String>. Method ini harus menunggufetchTemperaturedanfetchCondition, lalu mengembalikan string berformat:'[city]: [temperature]C, [condition]'
- Method
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!
- Buat instance
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!'
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil DataLatihan sendiri: Compiler Dart online