Future, Async, Await, Error Handling
Pemrograman Mobile
Septian Cahyadi, M.Kom., Muhamad Saad Nurul Ishlah, M.Comp.
Dept. Manajemen Informatika & Dept. Ilmu Komputer, Universitas Pakuan
Programming
print("Hello World!");
print("Hello World!");
baris kode dijalankan seketika
harus menunggu hingga data image masuk semuanya
Synchronous
Asynchronous
import 'dart:async';
void main() {
print('saya dicetak pertama');
var timer = Timer(
Duration(seconds: 3),
() => print('saya dicetak terakhir'),
);
print('saya dicetak kedua');
}
Future
, atau jika hasilnya memiliki beberapa bagian, hasilnya berupa Stream
.async
dan await
.Future<String> fetchUserOrder() {
return Future.delayed(
const Duration(seconds: 2),
() => 'Large Latte',
);
}
void main(){
fetchUserOrder();
print('Ambil data pesanan');
}
Future
merupakan salah satu kelas yang disediakan oleh Dart yang seperti namanya berarti masa depan, jadi kelas ini gunanya untuk mengembalikan masa depan atau mengembalikan nilainya untuk waktu yang akan datangfuture
(dengan f kecil) merupakan instan/objek dari FutureStatus dari Future:
Uncompleted
Ketika fungsi asinkron dipanggil, dia mengembalikan sebuah instan future yang tidak komplit (uncompleted)
Menunggu operasi asinkron untuk selesai atau mengembalikan eror
Completed:
Selesai,
Future<T>
(selesai mengembalikan nilai),
Future<void>
(selesai tidak mengembalikan nilai)
Selesai dengan error
Keyword async
dan await
menyediakan cara deklarasi untuk mendefinisikan fungsi asinkron dan menggunakan nilainya. dalam menggunakan async
dan await
ingat pedoman dasar ini :
sebelum menggunakan fungsi asinkron, terlebih dahulu tambahkan keyword async
sebelum badan fungsi
keyword await
akan berfungsi apabila dia berada dalam fungsi asinkron
berikut ini merupakan contoh yang mengkonversi dari fungsi sinkron ke dalam asinkron
Future<void> fungsiDart() async { ··· }
Jika fungsi memiliki tipe pengembalian yang dideklarasikan, maka perlu di perbaharui type menjadi Future<T>
, dimana T adalah tipe nilai yang dikembalikan oleh fungsi, jika fungsi pengembaliannya tidak secara eksplisit maka tipe data akan menjadi Future<void>
contoh :
Future<String> main() async { return “String”; }
Future<void> main() async { ··· }
Gunakan kata kunci await
untuk menunggu hingga Future
selesai:
print(await createOrderMessage());
String createOrderMessage() {
var order = fetchUserOrder();
return 'Your order is: $order';
}
Future<String> fetchUserOrder() {
// Imagine that this function is more complex and slow.
return Future.delayed(const Duration(seconds: 4),
() => 'Large Latte');
}
void main(){
print('Fetching user order ...');
print(createOrderMessage());
}
Future<String> createOrderMessage() async {
var order = await fetchUserOrder();
return 'Your order is: $order';
}
Future<String> fetchUserOrder() {
// Imagine that this function is more complex and slow.
return Future.delayed(const Duration(seconds: 4),
() => 'Large Latte');
}
Future<void> main() async{
print('Fetching user order ...');
print(await createOrderMessage());
}
Synchronous
Asynchronous
Fetching user order...
Your order is: Instance of '_Future<String>'
Fetching user order...
Your order is: Large Latte
Jenis return/kembalian untuk createOrderMessage()
berubah dari String
ke Future<String>
keyword async
muncul sebelum badan fungsi untuk createOrderMessage()
dan main()
keyword await
muncul sebelum memanggil fungsi asinkron fetchUserOrder()
dan createOrderMessage()
Suatu fungsi async
berjalan secara sinkron hingga kata kunci pertama await
muncul. Ini berarti bahwa di dalam badan fungsi asinkron, semua kode dijalankan secara sinkron sebelum kata kunci await pertama segera dieksekusi.
Lihat contoh kode di halaman selanjutnya!
Perhatikan bahwa pengaturan waktu output bergeser, sekarang print('Awaiting user order')
muncul setelah kata kunci pertama await
di printOrderMessage().
try-catch.
try
akan lanjut dieksekusi. Namun jika error akan ditangani oleh blok catch
try {
var order = await fetchUserOrder();
print('Awaiting user order...');
} catch (err) {
print('Caught error: $err');
}
try-catch
(Sederhana)
(Tanpa async dan await)
(Dengan async dan await)