Pengantar Future dan Promise
Pahami konsep inti `Future` untuk hasil asinkron dan `Promise` untuk menyelesaikannya.
Pengantar Future dan Promise adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 1 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 3 pelajaran total.
Kode Asinkron: Mengapa Penting
Dalam pemrograman, tugas dapat berjalan secara sinkron (satu demi satu) atau secara asinkron (tugas dapat dimulai tanpa menunggu tugas sebelumnya selesai).
Pemrograman asinkron sangat penting untuk membangun aplikasi responsif yang tidak membeku saat menunggu operasi lambat seperti permintaan jaringan atau kueri basis data.
Masalah dengan Pemanggilan yang Memblokir
Bayangkan program Anda perlu mengambil data dari internet. Jika operasi ini memblokir, program Anda akan berhenti sementara dan tidak melakukan hal lain sampai data tiba.
Hal ini dapat menyebabkan antarmuka pengguna "membeku" atau aplikasi sisi server menjadi tidak efisien. Kita memerlukan cara untuk menjalankan tugas-tugas ini di latar belakang tanpa menghentikan alur utama.
Memperkenalkan Scala Futures
Future milik Scala adalah alat yang kuat untuk pemrograman asinkron. Future merepresentasikan nilai yang mungkin belum tersedia, tetapi akan tersedia pada suatu waktu nanti.
- Anggaplah seperti memesan kopi: Anda mendapatkan tanda terima (
Future) dan dapat melakukan hal lain saat kopi Anda dibuat. - Saat kopi siap, tanda terima tersebut "selesai" dengan minuman Anda (hasilnya).
Membuat Future Pertama Anda
Anda dapat membuat Future dengan membungkus perhitungan dalam Future { ... }. Perhitungan ini akan berjalan di thread terpisah.
ExecutionContext diperlukan untuk menjadwalkan tugas-tugas ini. Demi kesederhanaan, kita akan menggunakan yang global.
import scala.concurrent.{Future, ExecutionContext}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
object Main extends App {
println("Starting computation...")
val f: Future[Int] = Future {
Thread.sleep(1000) // Simulate a long operation
42
}
f.onComplete {
case Success(value) => println(s"Result: $value")
case Failure(e) => println(s"Error: ${e.getMessage}")
}
println("Computation started, continuing...")
// Keep main thread alive for a bit to see Future's result
Thread.sleep(2000)
}Memahami ExecutionContext
ExecutionContext pada dasarnya adalah kumpulan thread tempat perhitungan asinkron dijalankan.
- ExecutionContext mengelola bagaimana dan kapan tugas dijalankan.
- Untuk contoh singkat,
scala.concurrent.ExecutionContext.Implicits.globalsering digunakan karena menyediakan kumpulan thread bawaan. - Dalam aplikasi nyata, Anda mungkin mengonfigurasi kumpulan thread tertentu untuk mengendalikan penggunaan sumber daya dengan lebih baik.
Menangani Hasil Future: onComplete
Metode onComplete digunakan untuk menentukan apa yang terjadi saat Future selesai, baik berhasil maupun gagal.
Metode ini menerima fungsi yang beroperasi pada scala.util.Try, yang dapat berupa Success(value) atau Failure(exception).
import scala.concurrent.{Future, ExecutionContext}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
object Main extends App {
val futureSuccess = Future { 10 / 2 }
val futureFailure = Future { 10 / 0 }
futureSuccess.onComplete {
case Success(result) => println(s"Success: $result")
case Failure(e) => println(s"Error: ${e.getMessage}")
}
futureFailure.onComplete {
case Success(result) => println(s"Success: $result")
case Failure(e) => println(s"Error: ${e.getMessage}")
}
Thread.sleep(100) // Allow Futures to complete and print
}Penangan yang Disederhanakan: Success/Failure
Untuk kasus yang lebih sederhana, Anda dapat menggunakan onSuccess dan onFailure masing-masing untuk menangani hanya hasil yang berhasil atau hanya error.
onSuccessmenerima fungsi untuk nilai yang berhasil.onFailuremenerima fungsi untuk pengecualian.- Keduanya adalah metode praktis yang dibangun di atas
onComplete.
import scala.concurrent.{Future, ExecutionContext}
import scala.concurrent.ExecutionContext.Implicits.global
object Main extends App {
val futureValue = Future { "Hello, Scala!" }
futureValue.onSuccess { case msg => println(s"Got message: $msg") }
futureValue.onFailure { case e => println(s"Oops, an error: ${e.getMessage}") }
val futureError = Future { throw new RuntimeException("Something broke!") }
futureError.onSuccess { case msg => println(s"Got message: $msg") }
futureError.onFailure { case e => println(s"Oops, an error: ${e.getMessage}") }
Thread.sleep(100) // Allow Futures to complete and print
}Apa Itu Scala Promise?
Jika Future adalah penampung sementara baca-saja untuk suatu hasil, Promise adalah wadah yang hanya dapat ditulis sekali dan dapat diselesaikan dengan nilai atau pengecualian.
Promisedigunakan untuk menyelesaikan sebuahFuture.- Anda membuat
Promise, mendapatkanFutureterkait, lalu menyelesaikanPromisesaat hasilnya siap.
Menyelesaikan Promise
Anda dapat menyelesaikan Promise menggunakan metode success() atau failure(). Setelah Promise diselesaikan, Future yang terkait dengannya juga akan selesai.
Mencoba menyelesaikan Promise lebih dari sekali akan menghasilkan error.
import scala.concurrent.{Future, Promise, ExecutionContext}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
object Main extends App {
val p = Promise[String]() // Create a Promise that will hold a String
val f: Future[String] = p.future // Get the Future associated with the Promise
f.onComplete {
case Success(value) => println(s"Future completed with: '$value'")
case Failure(e) => println(s"Future failed with: ${e.getMessage}")
}
// Simulate an async operation completing the promise
Future {
Thread.sleep(500)
p.success("Data fetched successfully!") // Complete the Promise
}
println("Promise created, waiting for completion...")
Thread.sleep(1000) // Keep main thread alive to see Future's result
}Future dan Promise Bersama-sama
Future dan Promise sering bekerja bersama. Pola yang umum adalah menggunakan Promise saat Anda perlu mengendalikan penyelesaian Future secara manual, mungkin dari sistem eksternal atau API lama berbasis callback.
Hal ini memungkinkan Anda membungkus operasi asinkron yang tidak berbasis Future ke dalam model Future, sehingga kompatibel dengan kode berbasis Future.
import scala.concurrent.{Future, Promise, ExecutionContext}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
object Main extends App {
def performLongTask(data: String): Future[String] = {
val p = Promise[String]()
// Simulate an external system or callback-based API
Future {
Thread.sleep(700)
if (data == "fail") p.failure(new Exception("Task failed!"))
else p.success(s"Processed: $data")
}
p.future // Return the Future that will be completed by the Promise
}
val task1 = performLongTask("input data")
task1.onComplete { case Success(res) => println(s"Task 1: $res") case Failure(e) => println(s"Task 1: ${e.getMessage}") }
val task2 = performLongTask("fail")
task2.onComplete { case Success(res) => println(s"Task 2: $res") case Failure(e) => println(s"Task 2: ${e.getMessage}") }
Thread.sleep(1500) // Keep main thread alive for results
}Pemeriksaan Singkat: Future vs. Promise
Pernyataan berikut mana yang menjelaskan peran Future dan Promise dalam Scala dengan benar?
Rangkuman: Future & Promise
Bagus sekali! Dalam pelajaran ini, Anda telah mempelajari dasar-dasar pemrograman asinkron dalam Scala:
Future: Penampung sementara untuk hasil yang pada akhirnya akan tersedia.Promise: Wadah yang hanya dapat ditulis sekali dan digunakan untuk menyelesaikanFuturesecara manual.ExecutionContext: Menjadwalkan eksekusi tugas asinkron.- Cara menangani hasil
FuturemenggunakanonComplete,onSuccess, danonFailure.
Konsep-konsep ini merupakan dasar untuk pola asinkron yang lebih kompleks!
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengantar Future dan Promise” gratis?
Ya — teks lengkap “Pengantar Future dan Promise” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “Pengantar Future dan Promise”?
Pahami konsep inti `Future` untuk hasil asinkron dan `Promise` untuk menyelesaikannya. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?
Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 3.
Berapa lama pelajaran “Pengantar Future dan Promise” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?
Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pengantar Future dan Promise
- Menggabungkan Operasi Asinkron
- Penanganan Galat dalam Future