Future/Promise — apa itu, komputasi asinkron dan pemrograman

Penulis: IT Sectr Diterbitkan: 2026-03-17 Waktu membaca: 9 mnt

Future/Promise adalah pola pemrograman asinkron yang mewakili wadah untuk hasil operasi yang belum selesai. Menurut Dart Documentation, 2025, Future adalah hasil read-only dari komputasi yang ditunda, Promise adalah kontrak write-only yang mengisi hasil ini. Future digunakan di Dart, Java, Scala dan C++ untuk rantai then/catch.

Poin Utama

  • Future — wadah read-only untuk hasil asinkron yang tersedia di masa depan
  • Promise — pengisi write-only yang menerima hasil dan meneruskannya ke Future
  • Rantai then — pemrosesan sekuensial operasi asinkron tanpa callback bersarang
  • Future di Dart — dasar async/await dan pustaka dio, http, shelf
  • Future/Promise — alternatif pola callback dan dasar sintaks async/await

Apa itu Future/Promise?

Future/Promise adalah sepasang objek yang saling terkait yang membagi hasil asinkron menjadi dua peran. Promise dapat menulis hasil (resolve) atau kesalahan (reject). Future hanya dapat membacanya — melalui callback (then, catchError) atau melalui await. Pemisahan ini menjamin bahwa konsumen tidak dapat mengubah hasil, hanya menggunakannya.

Future di Dart

Bahasa Dart menggunakan Future sebagai mekanisme asinkron utama. Future<T> adalah kontrak untuk menerima nilai tipe T di masa depan. Future dapat berada dalam salah satu dari tiga status: unresolved (operasi sedang berjalan), resolved with value (berhasil diselesaikan) atau resolved with error (selesai dengan kesalahan). Setelah beralih ke status resolved, Future tidak berubah.

Promise di JavaScript

Promise di JavaScript adalah analog dari Future Dart, tetapi dengan API yang lebih kaya. Promise menerima executor — fungsi dengan parameter resolve dan reject. Metode statis Promise.all, Promise.race, Promise.allSettled memungkinkan menggabungkan beberapa promise. Aplikasi modern menggunakan sintaks async/await di atas Promise.

Bagaimana Future bekerja

Future bekerja berdasarkan event loop — siklus peristiwa yang memproses operasi asinkron tanpa memblokir thread utama. Ketika fungsi asinkron dipanggil (misalnya http.get), ia segera mengembalikan Future. Permintaan sebenarnya dijalankan di latar belakang, sementara event loop terus memproses peristiwa lain. Setelah operasi selesai, Future beralih ke status resolved dan then dipanggil.

Event loop adalah mekanisme kunci yang menjadi dasar Dart dan JavaScript. Event loop mempertahankan dua antrian: microtask queue (tugas pendek yang dijalankan sebelum peristiwa berikutnya) dan event queue (peristiwa IO, timer). Future.then menempatkan callback di microtask queue, Future.microtask — eksekusi prioritas sebelum frame berikutnya.

Rantai then() memungkinkan pemrosesan sekuensial hasil operasi asinkron tanpa callback hell. Setiap then() menerima hasil dari langkah sebelumnya dan mengembalikan Future baru. catchError() di akhir rantai memproses kesalahan apa pun yang terjadi di langkah mana pun. Ini membuat kode asinkron menjadi linier dan mudah dibaca.

CompletableFuture di Java

Di Java, CompletableFuture memperluas konsep Future/Promise. Metode supplyAsync() menjalankan tugas asinkron di ForkJoinPool.commonPool(). thenApply() mentransformasi hasil, thenCompose() — membuka CompletableFuture bersarang. exceptionally() memproses kesalahan dengan mengembalikan nilai default. allOf() dan anyOf() bekerja seperti Promise.all dan Promise.race di JavaScript. CompletableFuture mendukung penyelesaian manual melalui complete() dan completeExceptionally() — ini analog dari Promise resolve/reject.

Promise dan kontrak asinkron

Promise adalah kontrak dengan salah satu dari tiga status: pending (menunggu), fulfilled (berhasil diselesaikan) atau rejected (selesai dengan kesalahan). Setelah beralih ke status fulfilled atau rejected, Promise tidak pernah berubah — ini menjamin imutabilitas hasil bagi semua konsumen. Metode .then() dipanggil secara asinkron setelah beralih ke status selesai mana pun.

Promise.all menunggu penyelesaian semua promise yang diberikan dan mengembalikan array hasil dalam urutan yang sama. Jika satu promise selesai dengan kesalahan — seluruh Promise.all beralih ke rejected. Promise.race mengembalikan hasil promise pertama yang selesai (sukses atau kesalahan). Promise.allSettled menunggu semua promise terlepas dari kesalahan — mengembalikan status masing-masing.

Chaining — keunggulan utama Promise dibandingkan callback. Setiap .then() mengembalikan Promise baru, memungkinkan pembangunan rantai dengan panjang sembarang. Kesalahan di mata rantai mana pun akan disebarkan ke .catch() terdekat. Metode finally() menjalankan kode setelah rantai selesai terlepas dari hasilnya — untuk membersihkan sumber daya.

Contoh kode Future (Dart)

Contoh pertama — membuat Future melalui fungsi async dan pemrosesan melalui then/catchError:

dart
Future<String> fetchData() async {
    await Future.delayed(Duration(seconds: 1))
    return "Data dimuat"
}

fetchData()
    .then((result) => print(result))
    .catchError((error) => print("Kesalahan: $error"))

Contoh kedua — menggabungkan beberapa Future melalui Future.wait:

dart
Future<List<String>> loadAll() async {
    final futures = [
        fetchFromApi("/users"),
        fetchFromApi("/posts"),
        fetchFromApi("/comments")
    ]
    final results = await Future.wait(futures)
    return results
}

Contoh ketiga — Promise di JavaScript dengan pembuatan manual dan rantai then:

js
const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("Selesai")
    }, 1000)
})

promise
    .then(value => console.log(value))
    .catch(err => console.error(err))

Future vs pola asinkron lainnya

Future/Promise berbeda dari gaya callback karena mengembalikan objek-kontrak alih-alih menerima fungsi callback sebagai argumen. Gaya callback menyebabkan bersarang (callback hell), sementara Future memungkinkan pembangunan rantai then() yang datar. Sintaks async/await membuat kode dengan Future menjadi lebih linier, mirip dengan kode sinkron.

Future mewakili tepat satu hasil asinkron — satu emisi, setelah itu Future berakhir. Tidak seperti Observable (Rx, ReactiveX) atau Flow (Kotlin Coroutines), Future tidak mendukung banyak nilai dari waktu ke waktu. Jika Anda membutuhkan aliran peristiwa — gunakan Stream di Dart, Observable di Rx, atau Flow di Kotlin.

CompletableFuture di Java — analog Promise dengan API yang diperluas: supplyAsync, thenApply, thenCompose, exceptionally. CompletableFuture memungkinkan menggabungkan beberapa operasi asinkron melalui allOf, anyOf, serta mengatur Executor sendiri untuk eksekusi. Scala Future menggunakan ExecutionContext untuk mengelola kumpulan thread dan mendukung komposisi melalui for-comprehension.

Di Dart, pola Future berbeda dari JavaScript Promise karena Dart memiliki pengetikan ketat: Future<String> menjamin tipe nilai yang dikembalikan. Fungsi async di Dart harus mengembalikan Future, dan kompiler memeriksa apakah semua jalur mengembalikan tipe yang benar. Future.wait setara dengan Promise.all — menerima Iterable<Future<T>> dan mengembalikan Future<List<T>>. Future.delayed dan Future.error adalah pabrik yang nyaman untuk menguji skenario asinkron.

Future/Promise diimplementasikan di Python melalui concurrent.futures.Future dan asyncio.Future. concurrent.futures.ThreadPoolExecutor.submit() mengembalikan Future yang dapat dipanggil result() — panggilan memblokir. asyncio.Future adalah wadah yang kompatibel dengan await untuk hasil asinkron di Asyncio. asyncio.gather() menjalankan beberapa coroutine secara paralel dan mengembalikan daftar hasil, mirip dengan Promise.all di JavaScript. Python juga menggunakan asyncio.ensure_future berbasis callback dan rantai add_done_callback untuk komposisi operasi asinkron, tetapi dalam kode modern, sintaks async/await dengan asyncio.Task lebih diutamakan.

Dalam pengembangan mobile, Future aktif digunakan di aplikasi Flutter. Setiap permintaan jaringan dari paket http atau dio mengembalikan Future. FutureBuilder — widget yang menerima Future dan snapshot status: connectionDone, hasData, hasError. Setelah menerima data, snapshot.data berisi hasil Future. StreamBuilder — analog untuk banyak nilai. FutureBuilder menghilangkan manajemen manual status pemuatan melalui setState.

Scala Future secara implisit menggunakan ExecutionContext — kumpulan thread tempat tugas asinkron dijalankan. Komposisi melalui map, flatMap, filter bekerja karena Future adalah monad. for-comprehension memungkinkan menggabungkan beberapa Future secara sekuensial tanpa bersarang: for { a <- futureA; b <- futureB } yield a + b. Future.sequence berfungsi seperti Promise.all. Fallback saat kesalahan diimplementasikan melalui recover dan recoverWith.

Future/Promise di C++ diwakili oleh kelas std::future dan std::promise dari pustaka <future>. std::async menjalankan fungsi asinkron dan mengembalikan std::future. std::promise memungkinkan pengaturan nilai manual melalui set_value() atau kesalahan melalui set_exception(). Tidak seperti Dart dan JavaScript, std::future.get() memblokir thread hingga hasil diterima — ini adalah perbedaan penting yang perlu dipertimbangkan saat merancang aplikasi multi-thread di C++.

Pola kerja dengan Future

Saat merancang API yang mengembalikan Future, ikuti aturan sumber kebenaran tunggal: setiap permintaan asinkron dibuat sekali dan di-cache melalui Future.memoize. Jika dua komponen meminta data yang sama, mereka mendapatkan Future yang sama — ini mencegah duplikasi permintaan. Untuk timeout, gunakan Future.timeout (Dart) atau Promise.race dengan timeout untuk menjamin bahwa operasi asinkron selesai dalam interval yang ditentukan.

Pola Retry di Future diimplementasikan melalui rantai rekursif: saat kesalahan di catch, fungsi asinkron yang sama dipanggil dengan penundaan. Exponential backoff meningkatkan interval antara percobaan: 1 detik — 2 detik — 4 detik — hingga maks 30 detik. Di Dart, ini dienkapsulasi dalam extension pada Future: future.retry(maxRetries: 3, delay: Duration(seconds: 1)). Di Scala, Future.zip menggabungkan dua hasil independen menjadi tuple — alternatif untuk Promise.all untuk dua Future. Pembatalan (Cancellation) tidak didukung di Future standar, tetapi diimplementasikan melalui CancellationToken atau AbortController di JavaScript.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara Future dan Promise?

Future adalah wadah read-only untuk membaca hasil asinkron melalui then atau await. Promise adalah kontrak write-only yang menerima nilai melalui resolve() dan menghubungkannya dengan Future. Di Dart dan JavaScript, konsep ini digabungkan: Future/Promise adalah satu kelas. Di Java dan Scala, mereka dipisahkan.

Apa perbedaan Future dengan Observable?

Future mewakili satu hasil asinkron — ia memancarkan tepat satu nilai dan berakhir. Observable (Rx) memancarkan banyak nilai dari waktu ke waktu — ini adalah aliran asinkron. Jika Anda membutuhkan satu respons HTTP — gunakan Future. Jika Anda membutuhkan aliran perubahan basis data — gunakan Observable atau Stream.

Apa itu async/await dan bagaimana hubungannya dengan Future?

async/await adalah gula sintaksis di atas Future/Promise. Kata kunci async menandai fungsi sebagai asinkron — ia mengembalikan Future. await menangguhkan eksekusi hingga Future selesai, tanpa memblokir thread. Di Dart, JavaScript, Python dan C#, async/await telah menggantikan rantai then di sebagian besar skenario.

Bagaimana cara menangani kesalahan dalam rantai Future?

Di Dart, gunakan .catchError() di akhir rantai — ia menangkap pengecualian di tahap mana pun. Di JavaScript — .catch(). Di Dart, try/await/catch juga tersedia di dalam fungsi async. Untuk pemulihan setelah kesalahan, gunakan .catchError() dengan mengembalikan nilai default atau Future baru.

Apa itu Promise.all dan kapan menggunakannya?

Promise.all menerima array promise dan mengembalikan satu Promise yang diselesaikan dengan array hasil. Semua promise dijalankan secara paralel — ini mempercepat eksekusi operasi independen (misalnya, memuat banyak file). Jika ada promise yang ditolak — seluruh Promise.all ditolak dengan kesalahan yang sama.

Kesimpulan

  • Future/Promise — pola pemrograman asinkron dengan kontrak untuk satu nilai
  • Future — wadah read-only untuk membaca hasil operasi
  • Promise — kontrak write-only yang mengisi Future melalui resolve/reject
  • Rantai then — pemrosesan datar langkah asinkron tanpa callback hell
  • async/await — gula sintaksis di atas Future, membuat kode linier
  • Promise.all — menjalankan beberapa operasi asinkron secara paralel
  • Untuk banyak nilai dari waktu ke waktu, gunakan Stream atau Observable, bukan Future

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga