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 LatteJenis 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)